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:
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:
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.
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();
}
}