Mediante un programa en Java se puede acceder a un fichero grabado en un dispositivo de almacenamiento tanto para escribir como para leer.
Como la información guardada en las variables o los arrays es volátil, perdiendose con el cierre del programa, con los fichers se puede guardar información.
Guardar la información en un fichero es preferible cuando es poca información la que se necesita guardar, de lo contrario es preferible una base de datos.
Los ficheros de texto se pueden manipular mediante cualquier editor de texto. Siempre que vayamos a utilizar ficheros de texto debemos incluir al principio del programa estas lineas:
import java.io.BufferedReader;
import java.io.FileReader;
Todas las operaciones sobre ficheros deben estar incluidas en un bloque try-catch, que nos permite mostrar mensaje de error y terminar el programa de una forma ordenadad en caso de que se produzca un fallo.
Tanto para leer como para escribir utilizamos lo que en programación se llama un "manejador de fichero", es algo que hace referencia al fichero con el que trabajamos.
En el siguiente ejemplo veremos un fichero .txt con información, de donde utilizaremos el manejador de fichero asociado bf, y leeremos linea a linea mediante bf.readLine() :
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
class EjemploFichero01 {
public static void main(String[] args) {
try {
BufferedReader bf = new BufferedReader(new FileReader("europa.txt"));
String linea = "";
while (linea != null) {
System.out.println(linea);
linea = bf.readLine();
}
bf.close();
} catch (FileNotFoundException e) { // qué hacer si no se encuentra el fichero
System.out.println("No se encuentra el fichero europa.txt");
} catch (IOException e) { // qué hacer si hay un error en la lectura del fichero
System.out.println("No se puede leer el fichero europa.txt");
}
}
}
bf.close() se utiliza para cerrar el fichero, una vez que se han realizado todas las operaciones necesarias.
El siguiente ejemplo tenemos un fichero que tiene escrito una serie de números, con cual vamos a hacer una serie de operaciones matematicas.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
class EjemploFichero08 {
public static void main(String[] args) {
System.out.print("Introduzca el nombre del archivo donde se encuentran los números: ");
String nombreFichero = System.console().readLine();
try {
BufferedReader bf = new BufferedReader(new FileReader(nombreFichero));
String linea = "0";
int i = 0;
double suma = 0;
while (linea != null) {
i++;
suma += Double.parseDouble(linea);
linea = bf.readLine();
}
i--;
bf.close();
System.out.println("La media es " + suma / (double)i);
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
La escritura se hace con el manejador.write(texto). Luego es importante ejecutar close() para grabar todo lo que hemos escrito. Hay que tener precaución a la hora de escribir en fichero, debito que se pueden producir bucles infinitos.
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
class EjemploFichero02 {
public static void main(String[] args) {
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("fruta.txt"));
bw.write("naranja\n");
bw.write("mango\n");
bw.write("chirimoya\n");
bw.close();
} catch (IOException ioe) {
System.out.println("No se ha podido escribir en el fichero");
}
}
}
Las operaciones de lectura y escritura se pueden combinar. Veamos un ejemplo:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
class EjemploFichero03 {
public static void main(String[] args) {
try {
BufferedReader bf1 = new BufferedReader(new FileReader("fichero1.txt"));
BufferedReader bf2 = new BufferedReader(new FileReader("fichero2.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("mezcla.txt"));
String linea1 = "";
String linea2 = "";
while ( (linea1 != null) || (linea2 != null) ) {
linea1 = bf1.readLine();
linea2 = bf2.readLine();
if (linea1 != null) bw.write(linea1 + "\n");
if (linea2 != null) bw.write(linea2 + "\n");
}
bf1.close();
bf2.close();
bw.close();
} catch (IOException ioe) {
System.out.println("Se ha producido un error de lectura/escritura");
System.err.println(ioe.getMessage());
}
}
}
Ademas de escribir y leer también hay otras operaciones. Como por ejemplo listar todos los archivos de un directorio. Veamos un ejemplo:
import java.io.File;
class EjemploFichero04 {
public static void main(String[] args) {
File fichero = new File("."); // se indica la ruta entre comillas
// el punto (.) es el directorio actual
String[] listaArchivos = fichero.list();
for(int i = 0; i < listaArchivos.length; i++){
System.out.println(listaArchivos[i]);
}
}
}
En este ejemplo se comprueba si existe un determinado archivo o no mediante exists(), y si existe se elimina con delete(), y si intentaremos borrar un archivo que no existe nos daria un error.
import java.io.File;
class EjemploFichero05 {
public static void main(String[] args) {
System.out.print("Introduzca el nombre del archivo que desea borrar: ");
String nombreFichero = System.console().readLine();
File fichero = new File(nombreFichero);
if (fichero.exists()) {
fichero.delete();
System.out.println("El fichero se ha borrado correctamente.");
} else {
System.out.println("El fichero " + nombreFichero + " no existe.");
}
}
}