jueves, 1 de noviembre de 2012

Lectura...pero de archivos

En este post me voy a dedicar a revisar una forma sencilla de leer y escribir sobre un archivo de texto, pero primero lo primero....

Archivos... Para quien no sabe qué es uno

Bueno, pues en general los archivos son bloques de datos ordenados que se pueden almacenar de manera secuencial en un dispositivo magnético, óptico o similar. Son los que nos llenan el disco duro del computador!. Básicamente hay dos tipos de archivos, los archivos texto y los archivos binarios.

Los archivos de texto esencialmente guardan eso: texto. Se podría pensar que guardan una colección de Strings separados por el carácter de cambio de linea y para leerlos literalmente recorreremos el archivo como si de una colección de cadenas de caracteres se tratara.

Los archivos binarios permiten guardar algunas otras cosas, normalmente representaciones de los objetos que trabajamos en un programa "como los trajeron al mundo", osea en binario. En este post me dedicaré a los primeros...

Nada mejor que un ejemplo

Lo primero que vamos a hacer es leer un archivo sencillo con personas y números de teléfono. Suponga que el archivo contactos.txt tiene el siguiente contenido:

Pepito Perez;4243430
Fulano Rodríguez;6508765

Para leerlo vamos a necesitar varias cosas...
1. La clase File: La clase File de java es una representación de un archivo en un sistema de archivos (¿De verdad?). Las carpetas (directorios) tambien pueden ser representados con esta clase. Entre otras uno puede instanciarla con un archivo para crearlo, saber su carpeta, listar los archivos que están en ella, etc. La usaremos para representar el archivo especifico que vamos a leer.
2. La clase FileReader: Esta clase permite abrir el archivo, es la clase que sabe acceder al disco para abrir un archivo.
3. La clase BufferedReader: Esta clase nos genera un lector con el que podamos leer "pedazo a pedazo" el archivo. Nos provee métodos para leer las líneas del archivo y saber si se acabó.

Miremos el siguiente código fuente:

public ArrayList<Persona> cargarArchivo ()  
      {  
           try   
           {  
                ArrayList<Persona> resultado = new ArrayList<Persona>();  
                File archivo = new File("../data/contactos.txt");  
                BufferedReader lector = new BufferedReader(new FileReader(archivo));  
                String linea = "";  
                int i=0;  
                while (( linea = lector.readLine()) != null )  
                {  
                     String[] partes = linea.split(";");  
                     Persona p = new Persona(partes[0], new Integer(partes[1]));  
                     resultado.add(p);  
                }
                lector.close();
                return resultado;  
           }   
           catch (FileNotFoundException e)   
           {  
                System.out.println("Archivo no encontrado");  
                return null;  
           }   
           catch (IOException e)   
           {  
                System.out.println("Error de lectura");  
                return null;  
           }  
           System.out.println("Carga del archivo exitosa!");  
           return new ArrayList<Persona>();  
      }  

Vamos por partes, dijo Jack el destripador....

El método que está en el ejemplo anterior carga las personas que están en el archivo en un ArrayList y los retorna. Algunas cosas que ver en este código.

1. las clausulas try, catch: En principio estas clausulas no tienen nada que ver con el tema de este post, de hecho son mecanismos que tiene java para manejo de Excepciones, en resumen una excepción es un error y estas clausulas sirven para saber que hacer con él. El bloque de código que se escribe dentro del try simplemente se realizará (aquí va lo que nos interesa), la clausula catch sirve para atrapar ciertos tipos de error, como pueden ver hay dos de ellas, una para error "no encontré el archivo" y otra para "error de lectura". El contenido de esos bloques es código que se ejecutará en caso que esos errores se presenten.

2. File: En el ejemplo se crea un nuevo archivo, el parámetro que se le envía podría ser solamente el nombre del archivo, con lo que buscaría en archivo en la ubicación donde la clase está corriendo (en la misma carpeta). En el ejemplo se usa el comodín ".." que significa "una carpeta arriba". después la carpeta data y el nombre del archivo. 

3. Los lectores. En el ejemplo se instancia un BufferedReader con un FileReader con un File adentro. De esta manera tendremos acceso por fin a lo que necesitamos.

4. El método readLine: Hace lo que dice, lee una linea y luego la próxima en cada llamado. retornará null si ya se acabó el archivo, por eso está en esos términos la condición del ciclo while.

5. Split: Es una utilidad que nos da la clase String, sirve para romper un String en partes dada una cadena, en este caso la usaremos para romper un "renglón" del archivo en dos partes, la que tiene el nombre y la que tiene el número de teléfono. El resultado del método es un arreglo de String con cada parte.

6. Close: Al final sería decente cerrar el archivo que se está usando... por programas mal hechos que no usan esa instrucción es que a veces no podemos sacar nuestras memorias USB de un computador, porque un programa se quedo con un archivo abierto!

En una próxima ocasión escribiré acerca de como crear y escribir en archivos de texto!

No hay comentarios:

Publicar un comentario