Vous êtes sur la page 1sur 5

Desarrollo de aplicaciones mviles

MTI Antonio Martnez Gonzlez

4. Creacin y manejo de ficheros


4.1 Ficheros en Android (I): Memoria interna

Prctica: Genere en Android una aplicacin que muestre la creacin y manejo de ficheros como se
describe a continuacin...

En temas anteriores hemos visto ya diversos mtodos 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 tambin de otros ficheros auxiliares de datos, probablemente con otro tipo
de contenidos y formatos. Por ello, en Android tambin podremos manipular ficheros tradicionales de
una forma muy similar a como se realiza en Java.
Lo primero que hay que tener en cuenta es dnde queremos almacenar los ficheros y el tipo de acceso
que queremos tener a ellos. As, podremos leer y escribir ficheros localizados en:

1. La memoria interna del dispositivo.


2. La tarjeta SD externa, si existe.
3. La propia aplicacin, en forma de recurso.
En los dos prximos artculos aprenderemos a manipular ficheros almacenados en cualquiera de
estos lugares, comentando las particularidades de cada caso.

Veamos en primer lugar cmo 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 deberamos abusar de este espacio utilizando ficheros de gran
tamao.

Escribir ficheros en la memoria interna es muy sencillo. Android proporciona para ello el mtodo
openFileOutput(), que recibe como parmetros 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 (por defecto)
para acceso privado desde nuestra aplicacin, MODE_APPEND para aadir 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.
Desarrollo de aplicaciones mviles

Este mtodo devuelve una referencia al stream de salida asociado al fichero (en forma de
objeto FileOutputStream), a partir del cual ya podremos utilizar los mtodos de manipulacin 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.
1
try
2
{
3
OutputStreamWriter fout=
4 new OutputStreamWriter(

5 openFileOutput("prueba_int.txt", Context.MODE_PRIVATE));

7 fout.write("Texto de prueba.");

8 fout.close();

9 }

catch (Exception ex)


10
{
11
Log.e("Ficheros", "Error al escribir fichero a memoria interna");
12
}
13

Est bien, ya hemos creado un fichero de texto en la memoria interna, pero dnde exactamente?
Tal como ocurra con las bases de datos SQLite, Android almacena por defecto los ficheros creados
en una ruta determinada, que en este caso seguir el siguiente patrn:

/data/data/paquete_java/files/nombre_fichero
En mi caso particular, la ruta ser

/data/data/net.sgoliver.android/files/prueba_int.txt
Si ejecutamos el cdigo anterior podremos comprobar en el DDMS cmo el fichero se crea
correctamente en la ruta indicada (Al final del artculo hay un enlace a una aplicacin de ejemplo
sencilla donde incluyo un botn por cada uno de los puntos que vamos a comentar en el artculo).
Desarrollo de aplicaciones mviles

Por otra parte, leer ficheros desde la memoria interna es igual de sencillo, y procederemos de forma
anloga, con la nica diferencia de que utilizaremos el mtodo openFileInput() para abrir el
fichero, y los mtodos de lectura de java.io para leer el contenido.
1
try
2
{
3
BufferedReader fin =
4
new BufferedReader(
5 new InputStreamReader(

6 openFileInput("prueba_int.txt")));

8 String texto = fin.readLine();

9 fin.close();

}
10
catch (Exception ex)
11
{
12
Log.e("Ficheros", "Error al leer fichero desde memoria interna");
13
}
14

La segunda forma de almacenar ficheros en la memoria interna del dispositivo es incluirlos


como recurso en la propia aplicacin. Aunque este mtodo es til en muchos casos, slo debemos
Desarrollo de aplicaciones mviles

utilizarlo cuando no necesitemos realizar modificaciones sobre los ficheros, ya que tendremos limitado
el acceso a slo lectura.
Para incluir un fichero como recurso de la aplicacin 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 opcin New / Folder.

Una vez creada la carpeta /raw podremos colocar en ella cualquier fichero que queramos que se
incluya con la aplicacin en tiempo de compilacin en forma de recurso. Nosotros incluiremos como
ejemplo un fichero de texto llamado prueba_raw.txt. Ya en tiempo de ejecucin podremos acceder
a este fichero, slo 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 aplicacin con el
mtodo getResources() y sobre stos utilizaremos el
mtodoopenRawResource(id_del_recurso) para abrir el fichero en modo lectura. Este mtodo
devuelve un objeto InputStream, que ya podremos manipular como queramos mediante los
mtodos de la API java.io. Como ejemplo, nosotros convertiremos el stream en un
objetoBufferedReader para leer el texto contenido en el fichero de ejemplo (por supuesto los
ficheros de recurso tambin pueden ser binarios, como por ejemplo ficheros de imagen, video, etc).
Veamos cmo quedara el cdigo:
1 try

2 {

3 InputStream fraw =

4 getResources().openRawResource(R.raw.prueba_raw);

6 BufferedReader brin =

new BufferedReader(new InputStreamReader(fraw));


7
Desarrollo de aplicaciones mviles

9 String linea = brin.readLine();

10

11 fraw.close();

}
12
catch (Exception ex)
13
{
14
Log.e("Ficheros", "Error al leer fichero desde recurso raw");
15
}
16

Como puede verse en el cdigo anterior, al mtodo openRawResource() le pasamos como


parmetro el ID del fichero incluido como recurso, que seguir el patrn R.raw.nombre_del_fichero,
por lo que en nuestro caso particular ser R.raw.prueba_raw.