Bienvenidos sean a este post, hoy veremos como se trabaja con los archivos en los distintos tipo de memoria, para ello utilizaremos a Asteroides, les recomiendo este post para crearlo en caso de ser necesario, para este caso crearemos varias formas de almacenar nuestras puntuaciones, para el primer caso agregaremos una forma de guardar en nuestra memoria interna, para ello procedamos abriendo nuestra app Asteroides.

Anuncios

Hagamos una nueva clase llamada AlmacenPuntuacionesArchivoInterno, donde reemplazaremos el codigo generado por el siguiente:

package com.tinchicus.asteroides;

import android.content.Context;
import android.util.Log;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.Vector;

public class AlmacenPuntuacionesArchivoInterno implements
        AlmacenPuntuaciones {

    private static String ARCHIVO = "puntuaciones.txt";
    private Context contexto;

    public AlmacenPuntuacionesArchivoInterno(Context contexto){
        this.contexto = contexto;
    }

    public void guardarPuntuacion(int puntos, String nombre,
                                  long fecha){
        try
        {
            FileOutputStream a = contexto.openFileOutput(
                    ARCHIVO,Context.MODE_APPEND);
            String texto = puntos + " " + nombre + "\n";
            a.write(texto.getBytes());
            a.close();
        }
        catch (Exception e)
        {
            Log.e("Asteroides",e.getMessage(),e);
        }
    }

    public Vector<String> listaPuntuaciones(int cantidad){
        Vector<String> resultado = new Vector<String>();
        try
        {
            FileInputStream a = contexto.openFileInput(ARCHIVO);
            BufferedReader entrada = new BufferedReader(new InputStreamReader(a));
            int n = 0;
            String linea;
            do
            {
                linea = entrada.readLine();
                if (linea!=null){
                    resultado.add(linea);
                    n++;
                }
            } while(n < cantidad && linea!=null);
            a.close();
        }
        catch (Exception e)
        {
            Log.e("Asteroides",e.getMessage(),e);
        }
        return resultado;
    }
}
Anuncios

En este caso primero implementaremos a AlmacenPuntuaciones, nuestras instrucciones mas destacables son la constante donde tendremos el nombre de nuestro archivo y el constructor donde seteara el contexto de la misma, hablemos sobre el primer metodo, este sera el encargado de almacenar la informacion en el archivo informado en ARCHIVO, en este caso recibira tres datos (puntos, nombre y fecha) luego tendremos un try/catch para interceptar cualquier error, en este caso primero crearemos un objeto llamado a para poder manipular nuestro archivo al cual lo utilizaremos para escribir, informaremos el nombre del archivo y luego el tipo de acceso al mismo, para este caso es para agregar siempre al final del mismo, despues crearemos una cadena donde le asignaremos el valor de puntos y nombre, para luego escribirlo por medio de write() y por ultimo cerramos el archivo modificado y por ende grabando la modificacion. Nuestro siguiente metodo se encargara de obtener los resultados almacenados en nuestro archivo, para ello crearemos un objeto de tipo Vector llamado resultado, cuyo contenido sera de tipo String, luego utilizaremos otra vez el try/catch donde lo usaremos para captar errores, en el try crearemos un objeto para poder acceder a nuestro archivo llamado a, al cual por medio de openFileInput() donde informaremos el nombre del archivo (ARCHIVO) y lo abriremos en forma de lectura, nuestro siguiente objeto llamado entrada sera de la clase BufferedReader, la cual nos permitira tener a nuestro archivo listo para leer su contenido, donde por medio de un do…while iremos leyendo el contenido, primero tenemos a entrada donde se encargara de leer una linea y almacenarla en este, el siguiente condicional verifica que sea distinta de null y en caso de ser verdadero agregara a la misma a resultado y sumara uno a n, el while chequeara que n sea menor a cantidad, atributo informado cuando se llama al metodo, y que linea sea distinto de null, si todo sale bien y no ocurre ningun error retornara el contenido de resultado.

Despues haremos una modificacion mas en la clase MainActivity donde deberemos la siguiente linea:

almacen = new AlmacenPuntuacionesPreferencias(this);

Por esta linea:

almacen = new AlmacenPuntuacionesArchivoInterno(this);

La cual se encargara de utilizar a nuestra nueva clase, ahora podemos compilarlo y ejecutarlo como se ve en el siguiente video

Como pueden ver en el video jugue dos sesiones de Asteroides y me mantuvo los puntos de las partidas anteriores funcionando perfectamente nuestra solucion para almacenar datos en un archivo.

Nota: Si revisan via Device File Explorer encontraran el archivo dentro de la ubicacion del paquete en el directorio files pero recuerden que al desinstalar la app se removera tambien a este archivo.
Anuncios

En resumen, hoy hemos puesto en practica lo hablado en posts anteriores, hemos modificado a Asteroides para tener la capacidad de almacenar informacion por fuera de las preferencias pero dentro del paquete lo cual puede ocasionar inconvenientes a largo plazo, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00