Sie sind auf Seite 1von 21

Ficheros en Android

Memoria Interna y Memoria Externa


Opciones de almacenamiento
● Almacenamiento externo ● Preferencias compartidas

Almacenamiento de datos públicos en el Almacenamiento de datos primitivos


almacenamiento externo compartido. privados en pares
clave-valor(generalmente
● Bases de datos SQLite preferencias del usuario).

Almacenamiento de datos estructurados ● Almacenamiento interno


en una base de datos privada.
Almacenamiento de datos privados
● Conexión de red en la memoria del dispositivo.

Almacenamiento de datos en la Web


mediante tu propio servidor de red.
Memoria Interna
Ficheros Internos

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 Internos

Escribir ficheros en la memoria interna es muy sencillo.


Android proporciona para esto un método openFileOutput()

Parámetro modo de acceso:


● MODE_PRIVATE
● MODE_APPEND
● MODE_WORLD_READABLE
● MODE_WORLD_WRITABLE
Escribir Ficheros Internos
Este método devuelve una try
referencia al stream de 1
{
salida asociado al 2
OutputStreamWriter fout=
fichero. 3
new OutputStreamWriter(
openFileOutput("prueba_int.txt",
4
Del cual ya podremos 5
Context.MODE_PRIVATE));
utilizar métodos de 6
manipulación de ficheros 7
fout.write("Texto de prueba.");
tradicionales del lenguaje 8
fout.close();
java. 9
}
catch (Exception ex)
10
{
11
Log.e("Ficheros", "Error al escribir fichero a
12
memoria interna");
13
}
Escribir Ficheros Internos

Una vez creado el fichero de texto en la memoria interna,


Android almacena por defecto los ficheros cerrados en una
ruta determinada:

/data/data/paquete.java/files/nombre_fichero

Para poder comprobar que se haya creado correctamente en la


ruta indicada es necesario utilizar el DDMS
Leer Ficheros Internos

Leer ficheros desde la memoria interna es igual de sencillo.

La unica diferencia se encuentra en que utilizaremos el


metodo openFileInput() para abrir el fichero, y los metodos
de lectura de java.io para poder leer el contenido.
Leer Ficheros Internos
try
1 {
2 BufferedReader fin =
3 new BufferedReader(
4 new InputStreamReader(
5
6 openFileInput("prueba_int.txt")));
7
8 String texto = fin.readLine();
9 fin.close();
10 }
11 catch (Exception ex)
12 {
13 Log.e("Ficheros", "Error al leer fichero
14 desde memoria interna");
}
Memoria Externa
Ficheros Externos

Trabajar con memoria externa al dispositivo nos permite


evadir los conflictos de la memoria limitada por el sistema,
lo que generalmente es una memoria SD.

● El almacenamiento externo es público.


● Asegurar que la memoria esta presente y disponible para
leer y/o escribir
Escribir Ficheros Externos

Para esto la API de Android proporciona el metodo

getExternalStorageStatus(), el cuál nos idica si la memoria


externa se encuentra disponible, si se puede leer y escribir
en ella, devolviendo:
● MEDIA_MOUNTED
● MEDIA_MOUNTED_READ_ONLY
● Otro tipos de valores que indicaran la existencia de algun problema
(MEDIA_UNMOUNTED,MEDIA_REMOVED,MEDIA_BAD_REMOVAL, .. Entre otros..)
Escribir Ficheros Externos
1
boolean sdDisponible = false;
2
boolean sdAccesoEscritura = false;
En este ejemplo podemos 3
realizar una comprobación del 4
String estado = Environment.getExternalStorageState();
estado de la memoria externa: 5
if (estado.equals(Environment.MEDIA_MOUNTED))
6
{
La primera cláusula del if nos 7
sdDisponible = true;
8
indica si la memoria se sdAccesoEscritura = true;
9
encuentra montada }
10
else if (estado.equals(Environment.MEDIA_MOUNTED_READ_ONLY))
11
La segunda cláusula nos indica 12
{
que la memoria se encuentra 13
sdDisponible = true;
montada, pero solo con 14
sdAccesoEscritura = false;
permisos de lectura }
15
else
16
Y la ultima clausula nos dice {
17
sdDisponible = false;
que la memoria tiene algún 18
sdAccesoEscritura = false;
error o que simplemente no 19
}
puede ser utilizada. 20
Escritura Ficheros Externos

Una vez haya se haya verificado el estado actual de la memoria y que cumpla
con los permisos deseados para operar, podemos continuar.

Para escribir un fichero a la memoria externa tenemos que obtener la ruta al


directorio raiz de la memoria externa.

Para ello utilizaremos el metodo

getExternalStorageDirectory() de la clase Environment

el cuál nos retornara un objeto File con la ruta del directorio.


Escritura Ficheros Externos
1 try
2 {
Con el Objeto File File ruta_sd =
3
retornado, podremos 4
Environment.getExternalStorageDirectory();
File f = new File(ruta_sd.getAbsolutePath(),
generar otro con el nombre5
"prueba_sd.txt");
deseado para el fichero, 7 OutputStreamWriter fout =
creando un objeto file 8 new OutputStreamWriter(
9 new FileOutputStream(f));
combinando ambos
10
elementos. 11 fout.write("Texto de prueba.");
12 fout.close();
13 }
catch (Exception ex)
14
{
15
Log.e("Ficheros", "Error al escribir fichero a tarjeta
16 SD");
17 }
Escritura Ficheros Externos

El código anterior funciona sin problemas pero escribirá el fichero directamente en la carpeta raíz de la
memoria externa, aunque en ocasiones puede resultar necesario, no es una buena práctica. Lo correcto
sería disponer de una carpeta propia para nuestra aplicación, lo que además tendrá la ventaja de que al
desinstalar la aplicación también se liberará este espacio.

Esto lo conseguimos utilizando el método getExternalFilesDir(null) en vez de


getExternalStorageDirectory().

El método getExternalFilesDir()nos devuelve directamente la ruta de una carpeta específica para


nuestra aplicación dentro de la memoria externa siguiendo el siguiente patrón:

<raíz_mem_ext>/Android/data/nuestro.paquete.java/files
Escritura Ficheros Externos

Si en vez de null le indicamos como parámetro un tipo de datos determinado (DIRECTORY_MUSIC,


DIRECTORY_PICTURES, DIRECTORY_MOVIES, DIRECTORY_RINGTONES, DIRECTORY_ALARMS,
DIRECTORY_NOTIFICATIONS, DIRECTORY_PODCASTS) nos devolverá una subcarpeta dentro de la anterior con
su nombre correspondiente. Así, por ejemplo, una llamada al método
getExternalFilesDir(Environment.DIRECTORY_MUSIC) nos devolvería la siguiente carpeta:

<raíz_mem_ext>/Android/data/nuestro.paquete.java/files/Music

Esto último, además, ayuda a Android a saber qué tipo de contenidos hay en cada carpeta, de forma que
puedan clasificarse correctamente por ejemplo en la galería multimedia.
Leer Ficheros Externos

Para tener acceso a la memoria externa, tendremos que


especificar ene l fichero AndroidManifest.XML que nuestra
aplicacion necesita permiso de escritura en dicha memoria.

Para esto usaremos la clausula <uses-permission> con el


valor concreto android.permission.WRITE_EXTERNAL_STORAGE
Leer Ficheros Externos
<manifest
xmlns:android="http://schemas.android.com/apk/res/android
"
package="net.sgoliver.android.ficheros"
android:versionCode="1"
Tomando en cuenta lo android:versionName="1.0" >
anterior, nuestro fichero <uses-sdk
AndroidManifest.xml deberá de android:minSdkVersion="8"
tener una estructura muy android:targetSdkVersion="17" />
similar a la mostrada en el
<uses-permission
ejemplo. android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
...
</activity>
</application>

</manifest>
Leer Ficheros Externos

Obtendremos el directorio raíz de la memoria externa con el


método getExternalStorageDirectory() , o la carpeta
específica de nuestra aplicación con getExternalFilesDir()

Creamos un objeto File donde se combinará la ruta con el


nombre del fichero que se desea leer.

Para leer el texto utilizaremos un BufferedReader


Leer Ficheros Internos
try
{
File ruta_sd = Environment.getExternalStorageDirectory();
Como se puede apreciar,
File f = new File(ruta_sd.getAbsolutePath(), "prueba_sd.txt");
el código es muy
similar al visto para BufferedReader fin =
la escritura de new BufferedReader(
ficheros. new InputStreamReader(
new FileInputStream(f)));

String texto = fin.readLine();


fin.close();
}
catch (Exception ex)
{
Log.e("Ficheros", "Error al leer fichero desde tarjeta SD");
}

Das könnte Ihnen auch gefallen