archivo: Ejemplo9.java - compilar con "javac Ejemplo9.java", etc. etc.
import java.io.*;
public class Ejemplo9 {
public static void main(String args[]) throws FileNotFoundException,IOException {
FileInputStream fptr;
DataInputStream f;
String linea = null;
fptr = new FileInputStream("Ejemplo9.java");
f = new DataInputStream(fptr);
do {
linea = f.readLine();
if (linea!=null) System.out.println(linea);
} while (linea != null);
fptr.close();
}
}
(Caramba! ¿Qué hace ese throws ahí?)
El programa de ejemplo simplemente lee un archivo de texto y lo muestra en pantalla, algo así como el type del DOS o el cat de Unix.
Dejemos por ahora el throws FileNotFoundException,IOException y vamos al código.
fptr = new FileInputStream("Ejemplo9.java");
La clase FileInputStream (descendiente de InputStream) nos sirve para referirnos a archivos o conexiones (sockets) de una máquina. Podemos accederlos pasando un String como aquí, un objeto de tipo File o uno de tipo FileDescriptor, pero en esencia es lo mismo. Al crear un objeto de este tipo estamos "abriendo" un archivo, clásicamente hablando.
Si el archivo no existe (por ejemplo reemplacen "Ejemplo9.java" por alguna otra cosa, como "noexiste.txt"), al ejecutarlo nos aparece un error:
C:\java\curso>java Ejemplo9
java.io.FileNotFoundException: noexiste.txt
at java.io.FileInputStream.<init>(FileInputStream.java:51)
at Ejemplo9.main(Ejemplo9.java:9)
(Caramba! ¿Dónde vi ese FileNotFoudException antes?)
Justamente, cuando el archivo al que quiero acceder no existe, Java "lanza" una excepción. Esto es, un aviso de que algo falló y, si no se toma ninguna acción, detiene el programa.
La clase FileInputStream puede "lanzar" (throws) la excepción FileNotFoundException.
¿Cómo capturar y tratar las excepciones? En seguida; primero terminemos con nuestro programa.
f = new DataInputStream(fptr);
La clase DataInputStream nos permite leer, en forma independiente del hardware, tipos de datos de una "corriente" (stream) que, en este caso, es un archivo. Es descendiente de FilterInputStream e implementa DataInput, una interface.
Al crear un objeto de tipo DataInputStream lo referimos al archivo, que le pasamos como parámetro (fptr); esta clase tiene toda una serie de métodos para leer datos en distintos formatos.
En nuestro programa usamos uno para leer líneas, que devuelve null cuando se llega al final del archivo o un String con el contenido de la línea:
do {
linea = f.readLine();
System.out.println(linea);
} while (linea != null);
En seguida de leer la línea la imprimimos, y repetimos esto mientras no nos devuelva null.
Al final, cerramos el archivo:
fptr.close();
Tanto readLine como close pueden lanzar la excepción IOException, en caso de error de lectura o cierre de archivo.
En realidad, podríamos no haber usado un DataInputStream y trabajar en forma más directa:
import java.io.*;
public class Ejemplo10 {
public static void main(String args[]) throws FileNotFoundException,IOException {
FileInputStream fptr;
int n;
fptr = new FileInputStream("Ejemplo9.java");
do {
n = fptr.read();
if (n!=-1) System.out.print((char)n);
} while (n!=-1);
fptr.close();
}
}
Ya que la clase FileInputStream también dispone de métodos para leer el archivo. Sólo que son unos pocos métodos que nos permiten leer un entero por vez o un arreglo de bytes. DataInputStream tiene métodos para leer los datos de muchas formas distintas, y en general resulta más cómodo.