Sistema interno de ficheros

 

Sistema interno de ficheros

Android permite almacenar ficheros en la memoria interna del teléfono. Por defecto, los ficheros almacenados solo son accesibles para la aplicación que los creó, no pueden ser leídos por otras aplicaciones, ni siquiera por el usuario del teléfono. Cada aplicación dispone de una carpeta especial para almacenar ficheros (/data/data/nombre_del_paquete/files). La ventaja de utilizar esta carpeta es que cuando se desinstala la aplicación los ficheros que has creado se eliminarán. Cuando trabajes con ficheros en Android, ten siempre en cuenta que la memoria disponible de los teléfonos móviles es limitada.

Recuerda que el sistema de ficheros se sustenta en la capa Linux, por lo que Android hereda su estructura. Cuando se instala una nueva aplicación, Android crea un nuevo usuario Linux asociado a la aplicación y es este usuario el que podrá o no acceder a los ficheros.

 

Puedes utilizar cualquier rutina del paquete java.io para trabajar con ficheros. Adicionalmente se han creado métodos adicionales asociados a la clase Contex para facilitarte el trabajo con ficheros almacenados en la memoria interna.

En particular los métodos  openFileInput()  y  openFileOutput()  te permiten abrir un fichero para lectura o escritura respectivamente. Si utilizas estos métodos el nombre del archivo no puede contener subdirectorios. De hecho el fichero siempre se almacena en la carpeta reservada para tu aplicación (/data/data/nombre_del_paquete/files). Recuerda siempre cerrar los ficheros con el método close(). El siguiente ejemplo muestra cómo crear un fichero y escribir en él un texto:

String fichero = "fichero.txt";

String texto = "texto almacenado";

           FileOutputStream fos;

           try {

             fos = openFileOutput(fichero,Context.MODE_PRIVATE);

             fos.write(texto.getBytes());

             fos.close();

            catch (FileNotFoundException e) {

             Log.e("Mi Aplicación",e.getMessage(),e);

            } catch (IOException e) {

             Log.e("Mi Aplicación",e.getMessage(),e);

            }

Es muy importante hacer un manejo cuidadoso de los errores. De hecho, el acceso a ficheros ha de realizarse de forma obligatoria dentro de una sección try/catch.

Además de los dos métodos indicados pueden serte útiles algunos de los siguientes: getFilesDir() devuelve la ruta absoluta donde se están guardando los ficheros.  getDir() crea un directorio en tu almacenamiento interno (o lo abre si existe).  deleteFile() borra un fichero.  fileList() devuelve un array con los ficheros almacenados por tu aplicación.

Ejercicio paso a paso: Almacenando puntuaciones en un fichero de la memoria interna

El siguiente ejercicio muestra una clase que implementa la interfaz AlmacenPuntuaciones utilizando los métodos antes descritos

1.     Abre el proyecto Asteroides.

2.     Crea una nueva clase AlmacenPuntuacionesFicheroInterno.

3.     Reemplaza el código por el siguiente:

public class AlmacenPuntuacionesFicheroInterno implements AlmacenPuntuaciones {
   private static String FICHERO = "puntuaciones.txt";
   private Context context;

   public AlmacenPuntuacionesFicheroInterno(Context context) {
      this.context = context;
   }

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

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

 

4.     Abre el fichero MainActivity.java y en el método onCreate() reemplaza la línea adecuada por:

almacen = new AlmacenPuntuacionesFicheroInterno(this);

 

Práctica: Configurar almacenamiento de puntuaciones desde preferencias.

 Modifica las preferencias de la aplicación Asteroides para que el usuario pueda seleccionar donde se guardarán las puntuaciones. De momento incluye tres opciones: “Array”, “Preferencias” y “Fichero en memoria interna”

1.     Abre el fichero Asteroides.java y en el método onCreate() reemplaza:

almacen = new AlmacenPuntuacionesFicheroInterno(this);

 

por  el código necesario para que se inicialice la variable almacen de forma adecuada según el valor introducido en preferencias.

2.     Verifica el resultado.

3.     Cada vez que añadas un nuevo método de almacenamiento inclúyelo a la lista de preferencias.

Preguntas de repaso: Ficheros