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.
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!
ResponderEliminarNo 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í:
Eliminartry (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...