>> <<

Lenguaje Java

Acceso a ficheros de texto

Para trabajar con ficheros de texto en Java existen varias alternativas, aunque es habitual emplear las clases BufferedReader (lectura) y PrintWriter (escritura), ambas en el paquete java.io, que deberemos importar en el código.

import java.io.*;

Apertura de ficheros

Para abrir un fichero de lectura o escritura, simplemente creamos una instancia de objeto BufferedReader o PrintWriter, respectivamente. En el caso de Java, es obligatorio tratar las posible excepciones que se pueden producir al abrir el fichero y trabajar con él: FileNotFoundException si el fichero no existe, o IOException si hay un error al abrirlo.


// Lectura de fichero

BufferedReader lectura;

try
{
    lectura = new BufferedReader(new FileReader("fichero1.txt"));
    // Operaciones sobre el fichero...
} catch (FileNotFoundException e1) {
    // Tratar el error de fichero no encontrado
} catch (IOException e2) {
    // Tratar el error de entrada/salida
}

// Escritura de fichero

PrintWriter escritura;

try
{
    escritura = new PrintWriter("fichero2.txt");
    // Operaciones sobre el fichero...
} catch (IOException e2) {
    // Tratar el error de entrada/salida
}

Notar que, en el caso de la lectura, se construye el objeto BufferedReader a partir de un subtipo FileReader. En el caso de la escritura, no se captura la excepción de fichero no encontrado, ya que en este caso el fichero se va a crear, por lo que no es necesario que exista. En el caso de que el archivo ya exista y se abra para escritura, en principio se respeta su contenido previo, y dependiendo de las instrucciones que utilicemos para escribir, se continuará respetando o se borrará, como veremos a continuación.

Operaciones básicas sobre ficheros

Escritura de datos

Para escribir contenido en un fichero, una vez abierto, podemos emplear los métodos print o println (según si queremos terminar la línea o no al final), del objeto de escritura PrintWriter. Son similares a los mismos métodos para sacar datos por pantalla con System.out (consultar la sección de Salida de datos por pantalla para más información):

int n = 3;
escritura.println("El valor de la variable es " + n);

Las instrucciones print o println borran el contenido previo del fichero la primera vez que se ejecutan. Es decir, el primer print o println que hagamos borrará el contenido del fichero para crear nuevo, con sucesivos print o println. Para evitar esto, podemos emplear la instrucción append para ir añadiendo contenido al ya existente en el fichero:

escritura.append("Texto añadido al final");

Lectura de datos

Para leer datos del fichero, lo más recomendable es leer el contenido línea a línea (hasta que la lectura nos devuelva null) y luego procesar cada línea. Para ello emplearemos la instrucción readLine del objeto de lectura BufferedReader:

String linea = lectura.readLine();

Cierre de ficheros

Es importante cerrar el fichero tras terminar las operaciones de lectura o escritura. Para ello, simplemente llamamos al método close del objeto en cuestión:

lectura.close();
escritura.close();

Esto puede hacerse al final del bloque try donde estamos trabajando con el fichero o (preferiblemente) en el bloque finally tras las capturas de excepciones, para asegurarnos de que el fichero se va a cerrar pase lo que pase:

try
{
    escritura = new PrintWriter("fichero2.txt");
    // Operaciones sobre el fichero...
} catch (IOException e2) {
    // Tratar el error de entrada/salida
} finally {
    if (escritura != null)
    {
        try
        {
            escritura.close();
        } catch (Exception e) {}
    }
}

Notar que el cierre del fichero en sí también puede provocar una excepción, que debe capturarse.

También es posible, desde Java 7, abrir los archivos en el propio try, en lo que se llama try with resources, de modo que el archivo se cierra automáticamente al finalizar el bloque try, pase lo que pase, y ahorrando así la cláusula finally. Por ejemplo:

try (PrintWriter escritura = new PrintWriter("fichero2.txt"))
{
    // Operaciones sobre el fichero...
} catch (IOException e2) {
    // Tratar el error de entrada/salida
}

Ejemplo

El siguiente ejemplo lee todas las líneas de un fichero "datos.txt". En cada línea hay números separados por espacios. Tras leer cada línea, procesará todos los números que hay contenidos en ella y mostrará su suma:

try(BufferedReader lectura = new BufferedReader(new FileReader"datos.txt")))
{
    String linea;
    int numeroLinea = 0;
    while ((linea = lectura.readLine()) != null)
    {
        numeroLinea++;
        int suma = 0;
        // Partimos por espacios para separar los números
        String []numeros = linea.split(" ");
        // Recorremos los números, los pasamos a enteros y los vamos sumando
        for(string parte: numeros)
        {
            suma += Integer.parseInt(parte);
        }
        System.out.println("Suma de la línea " + numeroLinea + ": " + suma);
    }
} catch (FileNotFoundException e1) {
    System.out.println("Error: el fichero no existe");
} catch (IOException e2) {
    System.out.println("Error de E/S: " + e2.getMessage());
}
(C) NachoIB, 2020 - contacto.lenguaj.es@gmail.com