Ficheros Android - Almacenamiento Interno

Hola de nuevo chic@s! En esta lección vamos a ver los tipos de almacenamientos que tiene Android y como crear y leer ficheros en cada uno de ellos! ¡empecemos! ¡yupiiiiiiiiiiiiii!

Cada dispositivo compatible con Android soporta dos tipos de memoria, por un lado tenemos "memoria interna" en esta memoria esta instalada la ROM o versión de Android que corre nuestro dispositivo, y suele quedar parte libre para instalar las distintas aplicaciones además esta es la memoria que se borra cuando restablecemos los valores de fabrica que tanto nos molesta hacer! y por otro lado tenemos una "memoria externa" que se puede utilizar para guardar archivos y también para mover esas aplicaciones que ocupan mas. Esta memoria externa, puede ser un medio de almacenamiento extraíble (como una tarjeta SD) o una memoria interna (no extraíble). Los archivos guardados en el almacenamiento externo son de lectura global y pueden ser modificados por el usuario cuando permiten el almacenamiento masivo USB para transferir archivos de un ordenador.

Es posible que el fabricante del dispositivo particione la memoria interna con una partición de almacenamiento externo o "almacenamiento USB" es decir que cuando compremos un teléfono que nos decían que tenia 8Gb de memoria interna, veamos 2 particiones, una por ejemplo de 1,5Gb que se llama "memoria interna" y otra de 5,5Gb a la que llaman "memoria USB o memoria Externa" también es posible que además de esto pueda ofrecer una ranura para tarjetas SD. En este caso, la tarjeta SD no es parte del almacenamiento externo y nuestras aplicaciones no podrán acceder a esta tarjeta SD (el almacenamiento extra es sólo para que podamos proporcionar ficheros multimedia que el sistema escanea) pero repito, no podremos usar esta memoria SD para instalar aplicaciones o acceder a ella desde nuestras aplicaciones.

Te pongo varios ejemplos (móviles que he tenido desde el punto de vista Almacenamiento):

 Samsung Galaxy ACE. Este teléfono es una mierda (siento si lo tienes ;p) tiene una memoria interna que suele estar casi llena (dependiendo de la rom del operador) dejan un poquito de memoria libre en plan 20 o 30Mb, y luego tiene una memoria externa de 158Mb que enseguida se agota, también lleva una ranura SD en la que no podemos mover ninguna aplicación, el problema de este móvil es que da igual la targeta de memoria SD externa, como te dije antes las aplicaciones no tienen acceso a ella, tendremos siempre limitada la capacidad de aplicaciones que podemos instalar en este dispositivo.

 Samsung Galaxy S y SII. Este teléfono esta mejor, tiene 8Gb de memoria interna, Samsung a optado esta vez por 2 particiones, una d 1,5Gb para la memoria interna y el resto para la externa, también tiene ranura SD.

 Nexus4. Este teléfono tiene 2 versiones, tanto la de 8Gb como la de 16Gb tienen una única partición de memoria interna, sin posibilidad de tener memoria externa ni ranura SD, aunque hay tutoriales para particionar la memoria interna y hacer una memoria externa.

El tema de tener 2 particiones tiene sus ventajas e inconvenientes, pero para mi esto es bueno, porque cuando necesitamos cambiar la ROM o hacer un reset o WIPE, lo que borraremos será la memoria interna, con lo que no perderemos fotos y/o datos que podamos tener en esta partición

Precaución: Todas las aplicaciones pueden leer y escribir ficheros ubicados en el almacenamiento externo y el usuario puede eliminarlos.

Entonces.... ¿memoria Interna o Externa?

Como se que todo esto es dificil de "digerir" voy ha resumir:

Almacenamiento interno:
 Siempre disponible.
 Los archivos guardados aquí se puede acceder sólo por su aplicación de forma predeterminada.
 Cuando el usuario desinstala la aplicación, el sistema elimina todos los archivos de la aplicación de almacenamiento interno.
 El almacenamiento interno es mejor cuando quieres estar seguro de que ni el usuario ni otras aplicaciones pueden tener acceso a sus archivos.

Almacenamiento externo:
 No siempre está disponible, ya que el usuario puede montar el almacenamiento externo como almacenamiento USB y en algunos casos eliminar desde el dispositivo.
 Es de lectura global, por lo que los archivos guardados aquí pueden ser leídos fuera de su control.
 Cuando el usuario desinstala la aplicación, el sistema elimina los archivos de su aplicación de aquí sólo si los guarda en el directorio desde getExternalFilesDir ().
 Almacenamiento externo es el mejor lugar para los archivos que no requieren restricciones de acceso y de los archivos que desea compartir con otras aplicaciones o permitir al usuario acceder a un ordenador.

Crear Fichero en Memoria Interna

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 (por defecto) para acceso privado desde nuestra aplicación, 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.

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, como ejemplo, convertiremos este stream a un OutputStreamWriter para escribir una cadena de texto al fichero.

Ahh otra cosa mas! cuando desinstalemos la aplicación, estos archivos se eliminaran, ya que se guardan en la carpeta donde se instala la aplicación (mas adelante veremos donde). Además, este código debes de ponerlo dentro de un bloque try/catch ¿que es eso? es un bloque de código donde se controlan los errores, fíjate que el código que queremos ejecutar de forma segura lo ponemos entre los corchetes del try, Android intentara ejecutar este código, si por algún motivo hubiera un error, el código dejaría de ejecutarse y pasaría a leer el código que esta en la parte del catch y ejecutaría lo que estuviera entre los corchetes.

Esto en resumen es para que no veamos un "Forzar cierre" y que nos casque la aplicación! imagina que al intentar crear el fichero no tubieramos espacio en la memoria interna, en ese caso, daría un error "controlado" saltaría al catch (lo normal es notificar al usuario aquí) no se crearía el fichero, pero tampoco nos cascaria la aplicación

Veamos un ejemplo sencillo para crear y escribir un archivo privado en el almacenamiento interno:

try {
	OutputStreamWriter fout= new OutputStreamWriter(openFileOutput("mi_fichero.txt", Context.MODE_PRIVATE));
	fout.write("Esto es una prueba!");
	fout.close();
}
catch (Exception ex)
{
	Log.e("Ficheros", "Error al escribir fichero a memoria interna");
}
						

¿no es tan difícil verdad? ya tenemos creado un fichero con texto en la memoria interna, ¿pero dónde
cojones lo hemos grabado 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/nombre_de_la_aplicacion/files/nombre_fichero

El tema es que para acceder ahí desde el móvil debes ser Root.... pero bueno desde el emulador y desde Eclipse lo puedes ver (por que somos root del emulador) llendo a la perspectiva DDMS a la parte de File Explorer.

perpectiva DMMS y vista File Explorer

Para leer un archivo de almacenamiento interno

Vamos ahora a realizar la otra parte de la operación, leer ficheros desde la memoria interna es igual de sencillo, con la diferencia de que utilizaremos el método openFileInput() para abrir el fichero, y el método readLine() para leer el contenido (si lo que estamos leyendo es texto).

try{
	BufferedReader fin = new BufferedReader(new InputStreamReader(openFileInput("mi_fichero.txt")));
	String texto = fin.readLine();
	fin.close();
}
catch (Exception ex)
{
	Log.e("Ficheros", "Error al leer fichero desde memoria interna");
}				

¿que os parece? no es complicado, como ves escribir y leer ficheros en la memoria interna del teléfono es sencillo, la ventaja es que nos ahorramos la parte de crear una ubicación al fichero, siempre se crea y se lee desde el mismo sitio, tan solo nos preocupamos de su nombre. El inconveniente es que cuando desinstalemos la aplicación se nos borra este fichero, por lo que no podemos utilizar este método para guardar información que nos interese como permanente (cada uno tendrá sus motivos). Como todo requiere practica y hacer varias pruebas, pero vamos si yo pude. ¡tu también! animo y si no te aclaras, pregunta en el foro.

Si te a gustado este sitio, por favor haz click en me gusta en Facebook, Google+, Tweeter... es el único precio que te pido por este trabajo! ;P. Compartiendo, ayudaras a otros a encontrar esta web! GRACIASSSS.