Saltar al contenido

Ficheros en java (I).

El manejo de ficheros en java suele ser habitual sobre todo cuando queremos programar aplicaciones complejas. Por ejemplo programas con una interfaz gráfica.

Con java, así como cualquier otro lenguaje de programación, podemos leer y escribir información en diferentes tipos de archivos o ficheros.

Para poder manejar ficheros en java, utilizaremos clases que pone a nuestra disposición la API de java dentro de su paquete java.io.

Para aprender el manejo de archivos en java, lo haremos a través de diferentes ejemplos.

Escribir en ficheros con java.

Reemplazando el contenido.

En este primer ejemplo, vamos a aprender a escribir en un fichero de texto plano (con extensión txt) pero nos encontraremos con un inconveniente. En este primer ejemplo, veremos que si ejecutamos varias veces el programa con diferentes frases, el contenido del archivo se reemplazara.

package archivos;

// Importamos el paquete para el manejo de archivos
import java.io.*;

public class Principal {

    public static void main(String[] args) {
    
        // Creamos una variable de tipo File para manipular el archivo
        // y le asignamos la ruta de un archivo txt. En este caso,
        // asignaremos una ruta relativa.
        File archivo = new File("FicheroParaEscribir.txt");
         
        // Creamos una variable de tipo PrintWriter para escribir en el archivo
        PrintWriter escribir;
         
        // Verificamos que el archivo no existe
         
        if(!archivo.exists()) { // Si el archivo NO EXISTE...
             
            try {
                 
                // Creamos el archivo
                archivo.createNewFile();
                 
                // Asignamos un nuevo objeto PrintWriter
                //para escribir con codificación UTF-8
                escribir = new PrintWriter(archivo, "UTF-8");
             
                // Escribimos en el archivo.
                escribir.println("Primera frase escrita en el fichero");
                 
                // Cerramos el objeto de escritura
                escribir.close();
             
             
            } catch (IOException e) {
                 
                // Si no se puede lanzamos un mensaje
                //con el error que pueda ocurrir
                e.printStackTrace();
            }
        }
         
        else { // Si el archivo SI EXISTE.
             
            try {
                 
                // Asignamos un nuevo objeto PrintWriter para escribir
                // con codificación UTF-8
                escribir = new PrintWriter(archivo, "UTF-8");
             
                // Escribimos en el archivo.
                escribir.println("Primera frase escrita en el fichero");
                 
                // Cerramos el objeto de escritura
                escribir.close();
                 
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
         
        System.out.println("Programa finalizado.");
        }
}

Por otro lado, si nos fijamos, el fichero en el que escribimos tiene una ruta relativa. Si no existe se creará en la carpeta del proyecto, pero fuera de la carpeta src.

Escribir en ficheros txt conservando el contenido.

Para escribir en un archivo de texto plano, manteniendo los datos que tenemos en el archivo una vez guardado, lo haremos igual que en el caso anterior. Sin embargo, habrá una pequeña diferencia, y ésta es la declaración de una variable de tipo FileWrtter que también nos servirá para escribir en el archivo. Veamos un ejemplo para verlo más claro.

package archivos;

// Importamos el paquete para el manejo de archivos
import java.io.*;
// Importamos el paquete donde se encuentra el JOptionPane
import javax.swing.JOptionPane;

public class Principal {

    public static void main(String[] args) {
        // Creamos una variable de tipo File para manipular el archivo
	// y le asignamos la ruta de un archivo txt. En este caso,
	// asignaremos una ruta relativa.
	File archivo = new File("FicheroParaEscribir.txt");
		
	// Objeto para escribir en el archivo.
	FileWriter escribir;
		
	// Creamos una variable de tipo PrintWriter para escribir en el archivo
	// en este caso, lo almacenaremos en una variable llamada linea
	PrintWriter linea;
		
	// Declaramos dos variables donde se almacenará
        //lo que se escribirá en el fichero
	String nombre = "";
	String apellidos = "";
				
	// Verificamos que el archivo no existe
		
	if(!archivo.exists()) { // Si el archivo NO EXISTE...
            try {
                
                // Creamos el archivo
                archivo.createNewFile();

                // Pedimos los datos al usuario a través de un JOptionPane.
                nombre = JOptionPane.showInputDialog(null, "Escribe tu nombre");
                apellidos = JOptionPane.showInputDialog(null,
                        "Escribe apellidos");

                // Escribirmos en el archivo. Como segundo parámetro
                // le pasamos true para que escriba al final del archivo.
                escribir = new FileWriter(archivo, true);

                // Con esta instrucción escribimos en varias lineas.
                linea = new PrintWriter(escribir);

                // Escribimos en el archivo.
                linea.println(nombre + " " + apellidos);

                // Cerramos el objeto de escritura
                linea.close();
                escribir.close();

            } catch (IOException e) {
				
		// Si no se puede lanzamos un mensaje
                //con el error que pueda ocurrir
		e.printStackTrace();
            }
	}
		
	else { // Si el archivo SI EXISTE.
			
            try {

                // Pedimos los datos al usuario a través de un JOptionPane.
                nombre = JOptionPane.showInputDialog(null, "Escribe tu nombre");
                apellidos = JOptionPane.showInputDialog(null,
                        "Escribe apellidos");

                // Escribirmos en el archivo. Como segundo parámetro
                // le pasamos true para que escriba al final del archivo.
                escribir = new FileWriter(archivo, true);

                // Con esta instrucción escribimos en varias lineas.
                linea = new PrintWriter(escribir);

                // Escribimos en el archivo.
                linea.println(nombre + " " + apellidos);

                // Cerramos el objeto de escritura
                linea.close();
                escribir.close();

            } catch (Exception e) {
                e.printStackTrace();
            }		
	}
		System.out.println("Programa finalizado.");
    }

Leer ficheros en java de tipo texto plano.

Para esto vamos a ver el siguiente ejemplo en el que leeremos el mismo archivo que hemos escrito anteriormente.

package archivos;

// Importamos el paquete donde se encuentra la clase Random
import java.io.*;

public class Principal {

    public static void main(String[] args) {
        // Creamos una variable de tipo File para manipular el archivo
	// y le asignamos la ruta de un archivo txt. En este caso,
	// asignaremos una ruta relativa.
	File archivo = new File("FicheroParaEscribir.txt");
        
        // Creamos una variable para leer el archivo
        FileReader leer;
		
	// Creamos una variable para leer el texto de nuestro archivo
        String cadena;
        
        // Creamos una variable objeto que contendrá
        // una instancia de tipo FileReader dentro de una estructura
        // de control de errores try - catch.
        
        try {
            leer = new FileReader(archivo);
            
            try (
                // Creamos una instancia de tipo BufferedReader
                // Para almacenar lo que se va leyendo.
                BufferedReader lecturaAlmacenada = new BufferedReader(leer)) {
                cadena="";
                while(cadena != null){
                    cadena = lecturaAlmacenada.readLine();
                    if(cadena !=null){
                        System.out.println(cadena);
                    }
                }
            }
            leer.close();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }
}