sábado, 12 de mayo de 2012

Manejo de BufferedReader: convertirlo a ArrayList o Array

votar
   La entrada de hoy va a ser más breve, por su temática mayormente práctica. La clase BufferedReader es una de las más usadas en java, pero su utilización se aprende más a través de ejemplos que enrollándonos con un montón de teoría.

   Aún así, para los que no la conozcáis, os diré que BufferedReader pertenece al paquete java.io  y se utiliza para "leer"  archivos. Pero no se le puede pasar un archivo directamente como argumento al constructor, por que no lo admite, así que primero hay que crear un FileReader, que admite tanto archivos como Strings, y luego este FileReader será el argumento del constructor del BufferedReader. Si esto os parece muy lioso, veréis como se entiende mejor con un ejemplo.

   Supongamos que tenéis un archivo que queréis leer, y no sólo eso, si no que después queréis trabajar con él y para ello necesitáis convertirlo en un ArrayList o un Array, o incluso separarlo en partes. Todo eso lo veremos con el siguiente ejemplo.

    Yo he creado un mini-archivo para utilizar aquí, pero vosotros podéis usar alguno vuestro, todo lo amplio que queráis. El mío consiste en unas definiciones de unas palabras gallegas tomadas de un diccionario (no pasa nada si no entendéis gallego, lo importante es que comprendáis el código que viene luego ;) ).

lercho, -a: (de lercha<prerrom.*liscola<*lisca<celta *vlisca = vara).adx. 1.Lingoreteiro, insolente. 2.Dise da persoa que fala máis do debido. 3.Indecente. 4.Lacazán, preguiceiro. 5.Dise da persoa que come e bebe demasiado.
leria: (lat.lerias<gr.leros).s.f. 1.Conversa informal(estanche de leria). 2.Chanza, broma (tes moita gana de leria). 3.Conto, enredo, chisme, maraña, lío (déixate de lerias).
leriante: (de leria). adx. e s. 1.Lercho. 2.Dise da persoa que é moi bromista ou da que ten moita labia.
lerio: (de leria). s.m. 1.Asunto no que hai algunha complicación (andar metido nun lerio). 2.Lío, maraña, enredo (non se decataron do lerio). 3.Caso (o peor do lerio é que entre eles non se entenden). 4.Chisme, cousa sen importancia.



import java.io.*;
import java.util.*;
import java.util.regex.*;

public class Archivos{
   public static void main(String[] args){
      try{
         //El constructor de BufferedReader no admite directamente un archivo
         //por eso usamos FileReader
         BufferedReader reader = new BufferedReader(new FileReader("voc.txt"));
       
         //Vamos ahora a convertir el reader en un ArrayList.
         //  Nunca inicializéis String linea = reader.readLine() o dentro de 
         //  while se producirá un bucle infinito (puesto que linea nunca será nul
         String linea;
         List<String> arlist = new ArrayList<String>();
         while((linea=reader.readLine())!= null){ 
            arlist.add(linea);
          } 
            System.out.println(arlist);
         
        //Si ahora quisiésemos convertir ese ArrayList en un Array,
        //  haremos lo siguiente
         String[] s1 = arlist.toArray(new String[arlist.size()]);
         

        //Para separar el texto en dos array distintos
          String[] palabras;
          String[] definiciones;
          for (String st : arlist){
             Pattern  patrón = Pattern.compile("[(].+$");
             palabras = patrón.split(st);
             System.out.println(palabras[0]);
             }
           for (String str : arlist){
             Pattern patrón2 = Pattern.compile("[\\w]+:");
             definiciones = patrón2.split(str);
             System.out.println(definiciones[1]);
            }
          
        //Nunca olvidéis cerrar el BufferedReader. 
          reader.close();
        
       }catch(IOException ioe){
         System.out.println("Oh,oh");
       }catch(PatternSyntaxException pse){
         System.out.println("Oh,oh");
       }
     }
    }

   Como podéis ver, hemos utilizado también el paquete java.util.regex, que utiliza expresiones regulares para el manejo de texto. Conocer estas expresiones regulares es casi como aprenderse un lenguaje de programación nuevo. Para los que no sepáis nada del tema, podéis echar un ojo al tutorial de Oracle


   En este ejemplo, con el uso de las clases de regex hemos separado por un lado las palabras y por otro sus definiciones.


   Espero que esta entrada os haya sido útil.

4 comentarios:

  1. Muy buena explicación y excelente blog, muchas felicidades y le agradezco mucho Sonia

    ResponderEliminar
  2. Muchas gracias por su amabilidad.
    Me alegro de que le guste :-)

    ResponderEliminar
  3. muy buena explicacion corta y concisa

    ResponderEliminar