Skip to content

3 Ficheros de Textos

Introducción

En Java podemos utilizar dos tipos de ficheros: de texto o binarios; y el acceso a los mismos se puede realizar de forma secuencial o aleatoria. Los ficheros de texto están compuestos de caracteres legibles, mientras que los binarios pueden almacenar cualquier tipo de dato (int, float, boolean, etc.)

Ficheros de texto

Los ficheros de texto, los que normalmente se generan con un editor, almacenan caracteres alfanuméricos en un formato estándar (ASCII, UNICODE, UTF8, etc.) Para trabajar con ellos usaremos las clases FileReader para leer caracteres y FileWriter para escribir los caracteres en el fichero. Cuando trabajamos con ficheros, cada vez que leemos o escribimos en uno debemos hacerlo dentro de un manejador de excepciones try-catch. Al usar la clase FileReader se puede generar la excepción FileNotFoundException, ya que el nombre del fichero no exista o no sea válida, y al usar la clase FileWriter la excepción IOException, ya que el disco esté lleno o protegido contra escritura.

Lectura de ficheros de texto

Los métodos que proporciona la clase FileReader para la lectura son los siguientes:.

Método Función
int read() Lee un carácter y lo devuelve
int read(char[] buf) Lee hasta buf.length caracteres de datos de una matriz de caracteres (buf). Los caracteres leídos del fichero se van almacenando en buf.
int read(char[] buf, int desplazamiento, int n) Lee hasta n caracteres de datos de la matriz buf comenzando por buf[desplazamiento] y devuelve el número leído de caracteres.

En un programa Java para crear o abrir un fichero se invoca a la clase File y a continuación se crea el flujo de entrada hacia el fichero con la clase FileReader. Después se realizan las operaciones de lectura o escritura y cuando terminemos de usarlo lo cerraremos mediante el método close().

public class ReadFile {
    public void show() throws IOException {
        File file = new File("src/exercises/bloque_iv/tema_14/text_files/ReadFile.java");
        FileReader reader = new FileReader(file);

        int i;
        while ((i = reader.read()) != -1) { //se va leyendo un carácter
            System.out.println((char) i);
            reader.close();
        }
    }

    public static void main(String[] args) throws IOException {
        new ReadFile().show();
    }
}

En el ejemplo, la expresión (char) i convierte el valor entero recuperado por el método read() a carácter, es decir, hacemos un cast a char. Se llega al final del fichero cuando el método read() devuelve -1. También se puede declarar el fichero de la siguiente manera:

FileReader reader = new FileReader("src/exercises/bloque_iv/tema_14/text_files/ReadFile.java");

Si en vez de leer de carácter a carácter queremos ir leyendo en mayores cantidades, será necesario crearse un buffer con la cantidad a leer:

char b[]= new char[20];
while ((i = fic.read(b)) != -1) System.out.println(b);

BufferedReader

FileReader no contiene métodos que nos permita leer líneas completas, pero BufferedReader sí; dispone del método readLine() que lee una línea del fichero y la devuelve, o devuelve null si no hay nada que leer o se llega al final del fichero.

También dispone del método read() para leer un carácter. Para construir un BufferedReader es necesario un FileReader.

public class BufferRead {
    public void show() {
        try{
            BufferedReader buffer = new BufferedReader(new FileReader(
                    "src/exercises/bloque_iv/tema_14/text_files/ReadFile.java"));
            String linea;
            while((linea = buffer.readLine()) != null){
                System.out.println(linea);
            }
            buffer.close();
        } catch(FileNotFoundException fn){
            System.out.println("No se encuentra el fichero");
        } catch(IOException e){
            System.out.println("Error de E/S");
        }
    }

    public static void main(String[] args) {
        new BufferRead().show();
    }
}

Escritura de Ficheros de Textos

La clase FileWriter es la que se usa para poder escribir en ficheros de textos. Los métodos que proporciona son:

Método Función
void write(int c) Escribe un carácter.
void write(char[] buf) Escribe un array de carácteres.
void write(char[] buf, int desplazamiento, int n) Escribe n caracteres de datos en la matriz buf comenzando por buf[desplazamiento]
void write(String str) Escribe una cadena de caracteres
void append(char c) Añade un carácter a un fichero.

Estos métodos también pueden lanzar la excepción IOException. Igual que antes declaramos el fichero mediante la clase File y a continuación se crea el flujo de salida hacia el fichero con la clase FileWriter.

public class Write {
    public void show() throws IOException {
        File fichero = new File("file.txt"); //declarar fichero
        FileWriter fic = new FileWriter(fichero);

        String cadena = "Esto es una prueba con FileWriter";

        char[] cad  = cadena.toCharArray();
        for (char c : cad) {
            fic.write(c); // se va escribiendo un carácter
        }

        fic.append('*'); //se añade al final un *
        fic.close(); //cerrar fichero
    }

    public static void main(String[] args) {
        new Write().show();
    }
}

Warning

Si el fichero a escribir no existe, se creará de forma automática. Además, hay que tener en cuenta que si el fichero existe cuando vayamos a escribir caracteres sobre él, todo lo que tenía almacenado anteriormente se borrará. Si queremos añadir caracteres al final, usaremos la clase FileWriter añadiendo un valor booleano, de tal forma que si es true, añadirá caracteres al final, si es false, lo sobrescribirá, de la misma forma como si no ponemos dicho valor.

FileWrite fic = new FileWriter(fichero, true);

BufferedWriter

La clase BufferedWriter también deriva de la clase Writer. Esta clase añade un buffer para realizar una escritura eficiente de caracteres. Para construir un BufferedWriter necesitamos la clase FileWriter. El método newLine() sirve para escribir un salto de línea.

public class BufferWrite {
    public void show() {
        try{
            BufferedWriter fichero = new BufferedWriter(
                    new FileWriter("file.txt"));

            for(int i = 1; i < 11; i++){
                fichero.write("Fila numero: " + i); //escribe una línea
                fichero.newLine(); // escribe un salto de línea
            }

            fichero.close();
        } catch (FileNotFoundException fn){
            System.out.println("No se encuentra el fichero");
        } catch (IOException io){
            System.out.println("Error de E/S");
        }
    }

    public static void main(String[] args) {
        new BufferWrite().show();
    }
}

PrintWriter

La clase PrintWriter, que también deriva de Writer, posee los métodos print(String), println(String), printf(String, Object) para escribir en un fichero.

Los tres métodos reciben una String y lo escriben en un fichero, pero el segundo método añade un salto de línea y el tercero la cadena formateada.

public class PrintWrite {
    public void show() throws IOException {
        PrintWriter fichero = new PrintWriter(new FileWriter("file.txt"));

        for(int i = 1; i < 11; i++){
            fichero.println("Fila numero: " + i);
        }

        fichero.close();
    }

    public static void main(String[] args) throws IOException {
        new PrintWrite().show();
    }
}