lunes, 2 de enero de 2012

Leer un archivo de texto en Java

Bueno pues vamos a ello. A más de uno que se ha puesto a aprender a programar o le están enseñando le han pedido hacer este ejercicio y hay mucha documentación sobre ello, pero haré esta entrada para dar "pie" al próximo artículo que sera sobre leer un fichero de Word, es decir un .doc o un .docx que no es igual que un fichero .txt.

Para leer un archivo usaremos Streams, que no es mala idea hacer una entrada sobre ellos -_-...Pero bueno, let's continue. Básicamente lo que haremos sera crear un objeto en referencia al archivo, de ese objeto leeremos pedazos de texto que se concatenaran en un buffer e iremos imprimiendo linea a linea en un ciclo hasta leer el texto entero. Vamos a ello!

Usaremos los siguientes imports:
import java.io.BufferedReader; //Buffer para almacenar los bytes leídos
import java.io.File; //Objeto donde se "copia" el archivo
import java.io.FileNotFoundException; //Excepción que sucede si el archivo no existe
import java.io.FileReader; //El lector del archivo que básicamente recibe el buffer
import java.io.IOException; //Excepción que sucede si no se puede manipular el archivo


Ahora, cargaremos el archivo a un objeto que se puede manipular con Java. Observar la doble barra \\ en la ruta, así Java solo tomará una de ellas. Si usas Linux entonces debes poner solo una barra pero de las otras "/".
//Cuidado con "\" recordar que es un simbolo de escape para Java
String ruta = "c:\ruta\del\archivo.txt"; //Está mal escrita

//Corrigamos la ruta:
ruta = "c:\\ruta\\del\\archivo.txt"; //la ruta esta bién escrita

//Y generamos el objeto respecto a la ruta del archivo
File archivo = new File(ruta);


Ya tenemos el archivo en un objeto. Lo que sigue es crear los objetos que usaremos para leer el archivo, leeremos linea por linea y necesitaremos una variable donde almacenar dicha linea de texto.
//Creamos la variable donde se almacenara la linea de texto leída
String linea = null;

//Ahora creamos los objetos necesarios para leer el archivo.
//Usamos este objeto que leera los bytes del archivo que ya creamos.
FileReader lector = new FileReader(archivo);

//Y creamos el buffer que guardara los bytes leidos pasandole al lector que lee los bytes.
BufferedReader buff = new BufferedReader(lector);


Bien, hay que recordar que podemos tener excepciones de FileNotFound y de IO al crear el FileReader y el BufferedReader, así que necesitamos usar un try y un catch. Al final lo implementare para que vean como queda. Lo siguiente es crear el bucle que leerá linea por linea y dentro del bucle decidiremos que hacer con esa linea, en este caso solo la imprimire con un S.o.p, veamos:
//Creamos el while, leyendo la linea en la condicion
//Y se lee hasta que el valor leido sea nulo, es decir cuando ya no haya mas lineas
while( ( linea = buff.readLine() ) != null ) {
 
 //Aqui dentro manejamos la linea
 System.out.println(linea);
 
}


Puede resultar confuso lo que se hace en el loop, más que nada en la condición. Así que puedes usar un "do while" y se obtiene el mismo resultado, pero como verás es más código:
//El mismo loop pero don un do while
do {
 //leemos del buffer
 linea = buff.readLine();
 
 if(linea != null) {
  //Si no es nula, la manipulamos
  System.out.println(linea);
 }
} while(linea != null);


Al finalizar el ciclo, solo hay que cerrar los objetos BufferedReader y FileReader con el método close() que lanza excepción en caso de un error, entonces debe ir en try y catch. Lo mejor es poner todo el código (o la mayoría) en el try y el catch para usarlo solo una vez.

Veamos el resultado final:
import java.io.BufferedReader; //Buffer para almacenar los bytes leídos
import java.io.File; //Objeto donde se "copia" el archivo
import java.io.FileNotFoundException; //Excepción que sucede si el archivo no existe
import java.io.FileReader; //El lector del archivo que básicamente recibe el buffer
import java.io.IOException; //Excepción que sucede si no se puede manipular el archivo

public class laLectura {
 public static void mani(String[] args) {
  //creamos la ruta (o la pedimos however)
  String ruta = "c:\\ruta\\del\\archivo.txt";
  
  //Y generamos el objeto respecto a la ruta del archivo
  File archivo = new File(ruta);
  
  //Creamos la variable donde se almacenara la linea de texto leída
  String linea = null;
  
  //Y colocamos el try y el catch
  try {
   //Ahora creamos los objetos necesarios para leer el archivo.
   //Usamos este objeto que leera los bytes del archivo que ya creamos.
   FileReader lector = new FileReader(archivo);
   
   //Y creamos el buffer que guardara los bytes leidos pasandole al lector que lee los bytes.
   BufferedReader buff = new BufferedReader(lector);
   
   //Creamos el while, leyendo la linea en la condicion
   //Y se lee hasta que el valor leido sea nulo, es decir cuando ya no haya mas lineas
   while( ( linea = buff.readLine() ) != null ) {
    //Aqui dentro manejamos la linea
    System.out.println(linea);    
   }
   
   //cerramos los objetos
   buff.close();
   lector.close();
  } catch(FileNotFoundException ex) {
   //No se encontró el archivo
  } catch(IOException ex) {
   //Error al abrir el fichero
  }
 } //fin del main
} //End class



Y eso es todo, claro que para una mejor interacción y comodidad del usuario, podemos pedir el fichero por un JFileChooser, pero esa ya es otra historia, que tal vez les cuente luego.


2 comentarios:

  1. En Basic he usado una funcion llamada input$(n_byte,fichero) y a partir de un bucle while eof(fichero) puedo ir trabajando, claro es muchisimo mas lenta ya que la lectura y el bucle se toman tiempo ¿Como implementaria algo similar en java? Saludos!

    ResponderEliminar
    Respuestas
    1. No se si entendí bien tu pregunta, básicamente si quieres el modo corto en la lectura (resumir codigo) podrias hacerlo usando java.util.Scanner, me parece que la manera más resumida de leer un fichero seria así:

      try (Scanner lector = new Scanner(new File("C:\\Users\\Cézar\\Desktop\\vis.txt"))) {
      while(lector.hasNextLine())
      System.out.println(lector.nextLine());
      } catch(Exception ex) {}

      Y con ese codigo te compila perfecto, ya que manejas la exception (FileNotFound), manejas el close() del file, y manejas por linea el archivo...

      Eliminar

Deja un comentario! =)