domingo, 14 de diciembre de 2014

Ficheros en Memoria Interna - Android



En apartados anteriores hemos visto ya diversos métodos para almacenar datos en nuestras aplicaciones, como por ejemplo los ficheros de preferencias compartidas o las bases de datos SQLite. Estos mecanismos son perfectos para almacenar datos estructurados, pero en ocasiones nos seguirá siendo útil poder disponer también de otros ficheros auxiliares de datos, probablemente con otro tipo de contenidos y formatos. Por ello, en Android también podremos manipular ficheros tradicionales de una forma muy similar a como se realiza en Java.

Lo primero que hay que tener en cuenta es dónde queremos almacenar los ficheros y el tipo de acceso que queremos tener a ellos. Así, podremos leer y escribir ficheros localizados en:

-La memoria interna del dispositivo.
-La tarjeta SD externa, si existe.
-La propia aplicación, en forma de recurso.

En los dos próximos apartados aprenderemos a manipular ficheros almacenados en cualquiera de estos lugares, comentando las particularidades de cada caso.

Veamos en primer lugar cómo trabajar con la memoria interna del dispositivo. Cuando almacenamos ficheros en la memoria interna debemos tener en cuenta las limitaciones de espacio que tienen muchos dispositivos, por lo que no deberíamos abusar de este espacio utilizando ficheros de gran tamaño.

Escribir ficheros en la memoria interna es muy sencillo. Android proporciona para ello el método openFileOutput(), que recibe como parámetros el nombre del fichero y el modo de acceso con el que queremos abrir el fichero. Este modo de acceso puede variar entre MODE_PRIVATE para acceso privado desde nuestra aplicación (crea el fichero o lo sobrescribe si ya existe), MODE_APPEND para añadir datos a un fichero ya existente, MODE_WORLD_READABLE para permitir a otras aplicaciones leer el fichero, o MODE_ WORLD_WRITABLE para permitir a otras aplicaciones escribir sobre el fichero. Los dos últimos no deberían utilizarse dada su peligrosidad, de hecho, han sido declarados como obsoletos (deprecated) en la API 17.

Este método devuelve una referencia al stream de salida asociado al fichero (en forma de objeto FileOutputStream), a partir del cual ya podremos utilizar los métodos de manipulación de ficheros tradicionales del lenguaje java (api java.io). Como ejemplo, convertiremos este stream a un OutputStreamWriter para escribir una cadena de texto al fichero.


Está bien, ya hemos creado un fichero de texto en la memoria interna, ¿pero dónde exactamente? Tal como ocurría con las bases de datos SQLite, Android almacena por defecto los ficheros creados en una ruta determinada, que en este caso seguirá el siguiente patrón:

/data/data/paquete_java/files/nombre_fichero

En mi caso particular, la ruta será

/data/data/net.sgoliver.android.ficheros/files/prueba_int.txt

Si ejecutamos el código anterior podremos comprobar en el DDMS cómo el fichero se crea correctamente en la ruta indicada (Al final del apartado hay un enlace a una aplicación de ejemplo sencilla donde incluyo un botón por cada uno de los puntos que vamos a comentar en el apartado).


Por otra parte, leer ficheros desde la memoria interna es igual de sencillo, y procederemos de forma análoga, con la única diferencia de que utilizaremos el método openFileInput() para abrir el fichero, y los métodos de lectura de java.io para leer el contenido.


La segunda forma de almacenar ficheros en la memoria interna del dispositivo es incluirlos como recurso en la propia aplicación. Aunque este método es útil en muchos casos, sólo debemos utilizarlo cuando no necesitemos realizar modificaciones sobre los ficheros, ya que tendremos limitado el acceso a sólo lectura.

Para incluir un fichero como recurso de la aplicación debemos colocarlo en la carpeta "/res/raw" de nuestro proyecto de Eclipse. Esta carpeta no suele estar creada por defecto, por lo que deberemos crearla manualmente en Eclipse desde el menú contextual con la opción "New / Folder".


Una vez creada la carpeta /raw podremos colocar en ella cualquier fichero que queramos que se incluya con la aplicación en tiempo de compilación en forma de recurso. Nosotros incluiremos como ejemplo un fichero de texto llamado "prueba_raw.txt". Ya en tiempo de ejecución podremos acceder a este fichero, sólo en modo de lectura, de una forma similar a la que ya hemos visto para el resto de ficheros en memoria interna.

Para acceder al fichero, accederemos en primer lugar a los recursos de la aplicación con el método getResources() y sobre éstos utilizaremos el método openRawResource(id_del_recurso) para abrir el fichero en modo lectura. Este método devuelve un objeto InputStream, que ya podremos manipular como queramos mediante los métodos de la API java.io. Como ejemplo, nosotros convertiremos el stream en un objeto BufferedReader para leer el texto contenido en el fichero de ejemplo (por supuesto los ficheros de recurso también pueden ser binarios, como por ejemplo ficheros de imagen, video, etc). Veamos cómo quedaría el código:


Como puede verse en el código anterior, al método openRawResource() le pasamos como parámetro el ID del fichero incluido como recurso, que seguirá el patrón "R.raw.nombre_del_fichero", por lo que en nuestro caso particular será R.raw.prueba_raw.

La aplicación de ejemplo de este apartado consiste en una pantalla sencilla con 3 botones que realizan exactamente las tres tareas que hemos comentado: escribir y leer un fichero en la memoria interna, y leer un fichero de la carpeta raw.


Saludos compañeros, aprovechen la información.









No hay comentarios:

Publicar un comentario en la entrada