Android

Android


7.MANEJO DE FICHEROS

Página 8 de 25

7.   MANEJO DE FICHEROS

Los dispositivos Android suelen tener una unidad de almacenamiento externo, como una tarjeta micro SD.  En esta sección veremos cómo se puede acceder a la tarjeta SD de almacenamiento externo del dispositivo Android para crear directorios y ficheros donde escribir los datos del programa. También trataremos la lectura de ficheros, tanto externos como internos.

7.1.   Escribir datos en un fichero en la tarjeta SD

Para manejar ficheros usamos la clase File del paquete java.io. Para escribir usamos FileOutputStream y PrintWriter. La clase Environment de Android proporciona información acerca del dispositivo de almacenamiento.

El siguiente programa escribe datos en un fichero en la tarjeta SD. Concretamente:

1)  Utiliza Environment.getExternalStorageState() para determinar si existe tarjeta SD y está disponible (mounted).

2)  Luego usamos Environment.getExternalStorageDirectory() para identificar el directorio correspondiente a la tarjeta SD.

3)  Crea un subdirectorio datos en la tarjeta (si no existe ya)

4)  Abre un fichero datos1.txt en el subdirectorio datos

5)  Escribe una cadena en el fichero datos1.txt

6)  Cierra el fichero.

import java.io.File;

public class CheckStorage extends Activity {

    TextView tv;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        tv=(TextView) findViewById(R.id.texto);

        String state=Environment.getExternalStorageState();

        tv.append("\nEstado:"+state);

        File root=Environment.getExternalStorageDirectory();

        File dir=new File (root.getAbsolutePath()+"/datos");

        dir.mkdirs();

        tv.append("\n\nNuevo directorio: "+dir);

        tv.append("\n\nContenido del directorio "+root+" :");

        String[] fichero=root.list();

        for(int i=0;i<fichero.length;i++) tv.append

        ("\n"+fichero[i]);

        File file=new File(dir,"datos1.txt");

        try{

           FileOutputStream fos = new FileOutputStream(file);

           PrintWriter pw= new PrintWriter(fos);

           pw.println("Primera linea del fichero");

           pw.flush();

           pw.close();

           tv.append("\n\n Fichero grabado");

        } catch (FileNotFoundException e){

        e.printStackTrace();

        tv.append("\n\n "+e);

     }

  }

}

Fichero main.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:background="#ffccaa"

  >

<TextView

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:text="Comprueba almacenamiento"

  android:textSize="24sp"

  android:textColor="#000000"

  android:id="@+id/texto"

  />

</LinearLayout>

La figura 7.1 muestra la salida de este programa. Como vemos, el directorio datos que queriamos crear no aparece en la lista y se produce un error FileNotFoundException al intentar escribir en el fichero datos1.txt. Esto se debe a que la actividad no tiene permiso para escribir. Este permiso debe declararse en el fichero .manifest añadiendo lo siguiente:

  <uses-permission

     android:name="android.permission.WRITE_EXTERNAL_STORAGE">

  </uses-permission>

Figura 7.1. Información sobre el contenido de la tarjeta SD.

Una vez declarado este permiso de escritura, el programa crea el directorio y escribe el fichero. La salida se muestra en la figura 7.2. El contenido de la tarjeta SD se puede comprobar en Eclipse abriendo la perspectiva DDMS, y examinando la ventana File Explorer. El fichero datos1.txt se puede copiar localmente en nuestro ordenador para examinarlo pulsando el botón "pull from device" (nota: si se produce un error al transferir el fichero, puede arreglarse reiniciando Eclipse).

Figura 7.2. Información sobre el contenido de la tarjeta SD y

mensaje de escritura exitosa de un fichero.

7.2.   Leer un fichero en el directorio res

La siguiente aplicación lee un fichero de datos datos1.txt que hemos copiado previamente en el directorio res/raw de la aplicación (desde Eclipse crear el directorio res/raw si éste no existe). El fichero contiene las siguientes lineas:

0 0.0

1 0.09983341664682815

2 0.19866933079506122

3 0.29552020666133955

4 0.3894183423086505

5 0.479425538604203

6 0.5646424733950354

7 0.644217687237691

8 0.7173560908995228

9 0.7833269096274834

Lo esencial en este programa es que el fichero datos1.txt debe asociarse a un InputStream mediante la instrucción:

InputStream input=

            getResources().openRawResource(R.raw.datos1);

Usamos el mismo main.xml      de la aplicación anterior. El programa Java de nuestra actividad es el siguiente:

   public class LeerFichero extends Activity {

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        TextView tv=(TextView)findViewById(R.id.texto);

        tv.append("\nLeer datos de res/raw/datos1.txt:");

        InputStream input=

            getResources().openRawResource(R.raw.datos1);

        InputStreamReader stream=

                          new InputStreamReader(input);

        BufferedReader buffer =

                          new BufferedReader(stream,8192);

        try{

           String linea;

           while(true){

             linea=buffer.readLine();

             if(linea==null) break;

             tv.append("\n"+linea);

           }

           input.close();

           stream.close();

           buffer.close();

        }catch(Exception e){

           tv.append("\n "+e);

        }

        tv.append("\nEnd of file");

    }

   }

El resultado tras leer el fichero se muestra en la pantalla de la figura 7.3.

Figura 7.3. Lee un fichero de datos en el directorio res/raw de la aplicación.

Ir a la siguiente página

Report Page