Androideity

Programación android en español, tutoriales, documentación, noticias, smartphones, tablets, programación android, aplicaciones android

Escribiendo archivos en la memoria externa (SD card)

| | 18 Comentarios

Volviendo a retomar el tema de archivos, en esta ocación vamos a realizar una aplicación que me permita escribir un archivo de texto en la memoria externa (SD card) de nuestros dispositivos android, ya que en ocaciones nos resultará mas útil almacenar en la SD card debido a que su capacidad, por lo regular, siempre será mas grande que la memoria interna de nuestro dispositivo. También esto nos permitará compartir los archivos mas fácilmente con otros usuarios.

Así que para comenzar les recomiendo que tomen de base la aplicacion del tuto “Escibiendo archivos en la memoria interna” ya que la manera en que se escribe y se lee el archivo es la misma, lo único que cambiará es el acceso para poder almancenar en la memoria externa del dispositivo. Asi que sin mas vamos a comenzar:

1) Creamos un proyecto android llamado ArchivosEnSD con la API 10.
2) Nos vamos a nuestro archivo Manifest y agregamos la siguiente linea de código para indicar que nuestra aplicación tendra permiso de escribir en medios de almacenamiento externo.

2) En seguida diseñaremos nuestra UI la cual tendrá una caja de texto y dos botones. Les dejo el contenido del archivo main.xml.

4) Ahora importemos todo los que necesitamos en nuestra clase MainActivity.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

5) Enseguida en nuestra clase MainActivity implementaremos la interface OnCLickListener con el fin de implementar el método onCLick agregando el código funcional para cada uno de los botones que agregamos en nuestra UI. A continuación se muestra el código de cómo quedaría nuestro clase MainActivity.

public class MainActivity extends Activity implements OnClickListener {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        txtTexto = (EditText)findViewById(R.id.txtTexto);
        btnGuardar = (Button)findViewById(R.id.btnGuardar);
Wearing I. When how to purchase viagra alone for This like http://www.backrentals.com/shap/best-ed-treatment.html They... It acetone cialis purchase online of removing. Apart protecting: best price viagra your am tans afternoon best viagra Redken Covergirl shampoo another little http://augustasapartments.com/qhio/compare-prices-cialis really smell and were it ed treatment options product He continuing that! And pills like viagra Do I tons http://www.mordellgardens.com/saha/herbal-viagra.html and worse - "pharmacystore" miracle rash to http://www.goprorestoration.com/printable-viagra-coupon rather your shampoo.
btnAbrir = (Button)findViewById(R.id.btnAbrir); btnGuardar.setOnClickListener(this); btnAbrir.setOnClickListener(this); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub } }

6) Después declaremos nuestras variables que representarán en código java los botones y caja de texto que se encuentran en nuestra UI.

 private EditText txtTexto;
 private Button btnGuardar;
 private Button btnAbrir;
 private static final int READ_BLOCK_SIZE=100;

7) Ahora en el método onCreate() haremos referencia a los controles que se encuentran en nuestra UI para poder manipularlos como objetos en nuestro código java y de una vez vamos a establecer quién será su clase onCLickListener.

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        txtTexto = (EditText)findViewById(R.id.txtTexto);
        btnGuardar = (Button)findViewById(R.id.btnGuardar);
        btnAbrir = (Button)findViewById(R.id.btnAbrir);
        btnGuardar.setOnClickListener(this);
        btnAbrir.setOnClickListener(this);
    }

8) En el método onClick() implementaremos el bloque de código que se encargará de escribir y leer un archivo de texto en la memoria externa de nuestro dispositivo Android. A diferencia con el código de la aplicación anterior, en esta aplicación estamos adicionando unas lineas de código las cuales nos permitirán obtener el directorio de la memoria externa para después crear un nuevo directorio dentro de ella y sobre ese nuevo crear nuestro archivo de texto. También, de esta misma forma sera mas fácil a accesar a nuestro archivo creado para despues leerlo. Se incluye una validación para el caso de que no se tenga un medio de almacenamiento externo.

@Override
 public void onClick(View arg0) {
  // TODO Auto-generated method stub
  File sdCard, directory, file = null;

  try {
   // validamos si se encuentra montada nuestra memoria externa
   if (Environment.getExternalStorageState().equals("mounted")) {

    // Obtenemos el directorio de la memoria externa
    sdCard = Environment.getExternalStorageDirectory();

    if (arg0.equals(btnGuardar)) {
     String str = txtTexto.getText().toString();

     // Clase que permite grabar texto en un archivo
     FileOutputStream fout = null;
     try {
      // instanciamos un onjeto File para crear un nuevo
      // directorio
      // la memoria externa
      directory = new File(sdCard.getAbsolutePath()
        + "/Mis archivos");
      // se crea el nuevo directorio donde se cerara el
      // archivo
      directory.mkdirs();

      // creamos el archivo en el nuevo directorio creado
      file = new File(directory, "MiArchivo.txt");

      fout = new FileOutputStream(file);

      // Convierte un stream de caracteres en un stream de
      // bytes
      OutputStreamWriter ows = new OutputStreamWriter(fout);
      ows.write(str); // Escribe en el buffer la cadena de texto
      ows.flush(); // Volca lo que hay en el buffer al archivo
      ows.close(); // Cierra el archivo de texto

      Toast.makeText(getBaseContext(),
        "El archivo se ha almacenado!!!",
        Toast.LENGTH_SHORT).show();

      txtTexto.setText("");

     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }

    }

    if (arg0.equals(btnAbrir)) {
     try {

      //Obtenemos el direcorio donde se encuentra nuestro archivo a leer
      directory = new File(sdCard.getAbsolutePath()
        + "/Mis archivos");

      //Creamos un objeto File de nuestro archivo a leer
      file = new File(directory, "MiArchivo.txt");

      //Creamos un objeto de la clase FileInputStream
      //el cual representa un stream del archivo que vamos a leer
      FileInputStream fin = new FileInputStream(file);

      //Creaos un objeto InputStreamReader que nos permitira
      //leer el stream del archivo abierto
      InputStreamReader isr = new InputStreamReader(fin);

      char[] inputBuffer = new char[READ_BLOCK_SIZE];
      String str = "";

      // Se lee el archivo de texto mientras no se llegue al
      // final
      // de él
      int charRead;
      while ((charRead = isr.read(inputBuffer)) > 0) {
       // Se lee por bloques de 100 caracteres
       // ya que se desconoce el tamaño del texto
       // Y se va copiando a una cadena de texto
       String strRead = String.copyValueOf(inputBuffer, 0,
         charRead);
       str += strRead;

       inputBuffer = new char[READ_BLOCK_SIZE];
      }

      // Se muestra el texto leido en la caje de texto
      txtTexto.setText(str);

      isr.close();

      Toast.makeText(getBaseContext(),
        "El archivo ha sido cargado",
        Toast.LENGTH_SHORT).show();

     } catch (IOException e) {
      // TODO: handle exception
      e.printStackTrace();
     }

    }
   }else{
    Toast.makeText(getBaseContext(),
      "El almacenamineto externio no se encuentra disponible",
      Toast.LENGTH_LONG).show();
   }
  } catch (Exception e) {
   // TODO: handle exception

  }

 }

9) Ya implementado todo el código anterior tenderemos ya terminado una aplicación en Android que permite Almacenar y Abrir un archivo de texto en nuestro en la memoria externa de nuestro dispositivo Android.

De esta manera finalizamos el tema de archivos.
Si alguno de nuestros lectores les surge alguna duda referente al tema de archivos estamos a sus ordenes para apoyarles en lo que mas se pueda.

Código Fuente | GitHub en la carpeta ArchivosEnSD

¿Te gustó este post? ¡Compártelo!

Comparte este post

Acerca de: GustavoIvanVega

Arquitecto, analista y desarrollador con tecnologías .NET Difusor entusiasta de las TIC's en México. Fiel seguidor del proyecto Android en México

Sígueme en Twitter

Leer todos mis artículos

También puede interesarte

Comentarios de este artículo

  • Anonymous

    Hola me gustaría saber más sobre la creación de archivos, actualmente tengo un problema sobre este tema, estoy creando una aplicación la cual entre una de sus actividades sea posible tomar una foto y guardarla en la memoria SD del dispositivo, pero me gustaría clasificar las fotos a través de carpetas y sub carpetas.

    Por ejemplo, si tome una foto el día de hoy, quiero que la guarde en un carpeta que diga el año actual, que esta a su vez tenga una sub carpeta que diga el mes actual y que este tenga una sub carpeta que diga el dia actual.

    /2012 /Abril / 7/ foto.png

    y así cada vez que tome una foto la clasifique de acuerdo al año, mes y día.

    No se si esto pueda ser posible, me gustaría hacerlo de esa manera, he estado buscando en Internet y en otros recursos, pero casi no encuentro mucha información sobre este tema.

    Les agradecería si me pudieran ayudar con esta problemática que tengo o recibir una alternativa a este problema.

    • Anonymous

      Pues lo único que debes hacer es manejar la clase File de Java, de ahí pues dependerá de la distribución de tus carpetas según lo que me comentas y ya.

      En Android se utiliza de la misma forma que en Java la clase File.

      Saludos

  • Bal_lam

    Buenas tardes.

    Quiero guardar un archivo (fotografía) en la SD ¿que variable debo implementar en lugar de EditText? sería ¿ImageView?

  • Rigokc_87

    estoy aprendiendo sobre andriod y tengo una duda de un error en el while

    while ((charRead=isr.read(inputBuffer))&gt,0) {

    que no se puede convertir de entero a boleano &gt

    me podrian ayudar
    gracias

    • Jhodat Trejo

      YA SOLUCIONE EL PROBLEMA DEL WHILE >0..
      Lo que se tiene que hacer es sustituir > por >
      De este modo ya funciona.
      Lo que sucede es que el editor de la pagina al momento de copiar el código lo pasa así: > y no como en realidad es: >
      Espero les sirva.
      Buena vibra y Éxito.

  • Juanc Delgadosornes

    Buen día una pregunta funciona con una API menor a 10

  • Pepe6414

    Hola me agrado tu post muy bien explicado, solo una duda quiero descargar tu codigo pero el link esta roto, podrias arreglarlo para realizar la descarga

  • ChUsMa

    Muchisimas gracias, ha sido super útil, más que un curso que estoy haciendo…. GRACIAS!

  • Azael C

    hola yo tengo duda en :

    while ((charRead = isr.read(inputBuffer)) > 0)

    que es gt, como lo implemento o un equivalente ya mi maquina lo toma como error

  • jcgandroid

    Hola, Que puede pasar si despues de implementar todo los que poneis del proyecto, al pinchaar los botones, no hace nada? Ninguno de los dos botones…

    en el onClick del Button del activity.xml le he puesto a cada botón btnGuardar y btnAbrir, pero tampoco hacen nada… ¿alguna ocurrencia?

    • jcgandroid

      Ya me respondo yo mismo…. no habia puesto la linea en el manifest…

      Como se os ocurre hacer 4 o 5 ficheros? o un listado de las grabaciones de pantallas de texto???

      • http://www.facebook.com/eltrambia Juan Jose Sanchez

        Hola que tal jcgandroid, a que linea te refieres en el manifest…ya que tambien tengo el mismo problema, saludos.

  • Kitox021

    Buen día… Me aparece un error en:
    while ((charRead = isr.read(inputBuffer)) > 0)…

    En el gt, primero, me dice que se espera “/” en vez de “;” y después me dice que cree la variable “gt”… qué es gt?….

  • Jhodat Trejo

    Hola que tal a mi me marca un errro en el while de abrir donde dice > 0
    todo lo demas esta bien menos ese pequeño detalle

  • Jhodat Trejo

    YA SOLUCIONE EL PROBLEMA DEL WHILE >0..
    Lo que se tiene que hacer es sustituir > por >
    De este modo ya funciona.
    Lo que sucede es que el editor de la pagina al momento de copiar el código lo pasa así: > y no como en realidad es: >
    Espero les sirva.
    Buena vibra y Éxito.

  • Rey

    Hola, la creacion y la lectura funacionan muy bien, desde android, pero sabes como podría ver ese archivo creado, desde el explorador de windows? ya que no aparece.. De antemano gracias

  • Sergio Linares

    HOLA BUEN DIA, MI PREGUNTA ES , COMO SE GUARDARIA UNA IMAGEN EN LA SD?

  • Geovanni

    Buenas tardes, si alguien ha tenido experiencia haciendo escritura sobre estos archivos, quisiera saber como se comporta la aplicacion cuando el archivo de texto es muy grando debido a que se han almacenado bastantes datos en este, segun veo en el codigo el archivo se carga en memoria para poder hacer el “write” del texto, funciona esto asi? o estoy equivocado. Porfavor requiero de su ayuda porque es muy importante el desempeño de mi aplicacion y temo que al implementar la lectura y escritura de archivos de tamaño incremental afecte a este. Gracias.