PRINCIPIOS DE MANEJO DE FICHEROS O ARCHIVOS

Aunque el manejo de archivos tiene características especiales, Java ofrece las siguientes posibilidades:

Existen las clases FileInputStream y FileOutputStream (extendiendo InputStream y OutputStream) que permiten leer y escribir bytes en archivos. Para archivos de texto son preferibles
FileReader (desciende de Reader) y FileWriter (desciende de Writer), que realizan las mismas funciones. Se puede construir un objeto de cualquiera de estas cuatro clases a partir de un String que contenga el nombre o la dirección en disco del archivo o con un objeto de la clase File que representa dicho archivo. Por ejemplo el código:

FileReader fr1 = new FileReader(“archivo.txt”);

Es equivalente a:

File f = new File(“archivo.txt”);
FileReader fr2 = new FileReader(f);

Si no encuentran el archivo indicado, los constructores de FileReader y FileInputStream pueden lanzar la excepción java.io.FileNotFoundException.
Los constructores de FileWriter y FileOutputStream pueden lanzar java.io.IOException. Si no encuentran el archivo indicado, lo crean nuevo. Por defecto, estas dos clases comienzan a escribir al comienzo del archivo. Para escribir detrás de lo que ya existe en el archivo (“append”), se utiliza un segundo argumento de tipo boolean con valor true:

FileWriter fw = new FileWriter(“archivo.txt”, true);

Las clases que se explican a continuación permiten un manejo más fácil y eficiente.

Clases File y FileDialog

Un objeto de la clase File puede representar un archivo o un directorio. Tiene los siguientes constructores:

File(String name)
File(String dir, String name)
File(File dir, String name).

Se puede dar el nombre de un archivo, el nombre y el directorio, o sólo el directorio, como path absoluto y como path relativo al directorio actual. Para saber si el archivo existe se puede llamar al método boolean exists().

File f1 = new File(“c:\\windows\\notepad.exe”); // La barra ‘\’ se escribe ‘\\’
File f2 = new File(“c:\\windows”); // Un directorio
File f3 = new File(f2, “notepad.exe”); // Es igual a f1

Una forma típica de preguntar por un archivo es presentar una caja de diálogo. La clase java.awt.FileDialog presenta el diálogo típico de cada sistema operativo para guardar o abrir ficheros. Sus constructores son:

FileDialog(Frame fr)
FileDialog(Frame fr, String title)
FileDialog(Frame fr, String title, int type)

donde type puede ser FileDialog.LOAD o FileDialog.SAVE según la operación que se desee realizar.
Es muy fácil conectar este diálogo con un File, utilizando los métodos String getFile() y
String getDirectory(). Por ejemplo:

FileDialog fd = new FileDialog(f, “Elija un archivo”);
fd.show();
File f = new File(fd.getDirectory(), fd.getFile());
ESCRITURA DE ARCHIVOS DE TEXTO

La clase PrintWriter es la más práctica para escribir un archivo de texto porque posee los métodos print(cualquier tipo) y println(cualquier tipo), idénticos a los de System.out (de clase PrintStream).
Un objeto PrintWriter se puede crear a partir de un BufferedWriter (para disponer de buffer), que se crea a partir del FileWriter al que se la pasa el nombre del archivo. Después, escribir en el archivo es tan fácil como en pantalla. El siguiente ejemplo ilustra lo anterior:

try {
FileWriter fw = new FileWriter(“escribeme.txt”);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter salida = new PrintWriter(bw);
salida.println(“Hola, soy la primera línea”);
salida.close();
// Modo append
bw = new BufferedWriter(new FileWriter(“escribeme.txt”, true));
salida = new PrintWriter(bw);
salida.print(“Y yo soy la segunda. “);
double b = 123.45;
salida.println(b);
salida.close();
}
cacth(java.io.IOException ioex) { }

ARCHIVOS QUE NO SON DE TEXTO

DataInputStream y DataOutputStream son clases de Java 1.0 que no han sido alteradas hasta ahora. Para leer y escribir datos primitivos directamente (sin convertir a/de String) siguen siendo más útiles estas dos clases.
Son clases diseñadas para trabajar de manera conjunta. Una puede leer lo que la otra escribe, que en sí no es algo legible, sino el dato como una secuencia de bytes. Por ello se utilizan para almacenar datos de manera independiente de la plataforma (o para mandarlos por una red entre ordenadores muy distintos).
El problema es que obligan a utilizar clases que descienden de InputStream y OutputStream y por lo tanto algo más complicadas de utilizar. El siguiente código primero escribe en el fichero prueba.dat para después leer los datos escritos:

// Escritura de una variable double
DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(“prueba.dat”)));
double d1 = 17/7;
dos.writeDouble(d);
dos.close();
// Lectura de la variable double
DataInputStream dis = new DataInputStream(
new BufferedInputStream(
new FileInputStream(“prueba.dat”)));
double d2 = dis.readDouble();

Dejar un comentario