Ficheros de caracteres¶
Las clases Java FileWriter
y FileReader
se utilizan para escribir y leer datos de archivos de texto (son clases de flujo de caracteres, character stream). Se recomienda no utilizar las clases FileInputStream
y FileOutputStream
si vamos a leer o escribir información de texto.
Escritura de caracteres¶
La clase Java FileWriter
del paquete java.io se utiliza para escribir datos en forma de caracteres en un archivo.
- Esta clase hereda de la clase
OutputStream
. - Los constructores de esta clase asumen que la codificación de caracteres predeterminada y el tamaño de búfer de bytes predeterminado son aceptables.
FileWriter
está diseñado para escribir secuencias de caracteres. Si queremos escribir flujos de bytes sin procesar, tendríamos que usar la claseFileOutputStream
.
Los métodos principales
Método | Descripción |
---|---|
void write(int caracter) | escribe un carácter en el archivo |
void write(String cadena) | escribe una cadena en el archivo |
void newline() | escribe un salto de línea en el fichero. Se debe evitar el uso explícito del carácter \n para insertar saltos de línea, ya que su codificación es distinta según la plataforma utilizada. |
void flush() | vacía el buffer de salida, escribiendo en el fichero los caracteres pendientes. |
void close() | cierra el flujo de salida, vaciando el buffer y liberando el recurso correspondiente. |
public static void main(String[] args) {
BufferedWriter fw=null;
try {
fw =new BufferedWriter(new FileWriter("output.txt"));
fw.write("Esto es un ejemplo");
//nueva linea
fw.newLine();
fw.write("Segunda linea");
} catch(IOException e) {
System.out.println("Error E/S: " + e);
}finally{
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
Cuando se cierra el stream close()
se escribe en el fichero. Si quisiéramos grabar en el fichero en algún momento antes de cerrar, podemos usar el método flush()
.
Escritura de String como System.out¶
Podemos utilizar la clase PrintWriter
para la escritura de String en el archivo. Proporciona métodos parececidos a System.out
public static void main(String[] args) {
try( FileWriter fileWriter = new FileWriter("output.txt");
PrintWriter printWriter = new PrintWriter(fileWriter);
) {
// Datos a escribir
String nombre = "Juan";
int edad = 30;
double altura = 1.75;
// Escribir los datos en el archivo con formato
printWriter.println("Nombre: "+nombre);
printWriter.println("Edad: "+edad);
//con formato
printWriter.printf("Altura: %.2f\n", altura);
System.out.println("Se ha escrito en el archivo exitosamente.");
} catch (Exception e) {
e.printStackTrace();
}
}
Lectura de datos¶
FileReader
es una clase en el paquete java.io que se usa para leer una secuencia de caracteres de los ficheros. Esta clase se hereda de la clase InputStreamReader
.
FileReader
está diseñada para leer flujos de caracteres. Para leer flujos de bytes sin procesar, usaremosFileInputStream
.
Los métodos principales
Método | Descripción |
---|---|
readLine() | para leer líneas de texto del fichero (String). Este método devuelve null cuando no hay más líneas para leer |
read() | para leer carácter a carácter. Devuelve un entero que representa el código Unicode del carácter leído. Devuelve -1 si no hay más caracteres. |
public static void main(String[] args) {
int ch;
try(FileReader fr = new FileReader("output.txt");) {
ch = fr.read();
while (ch != -1) { //fin de fichero
System.out.print((char) ch);
ch = fr.read();
}
} catch (IOException fe) {
System.out.println("Error de E/S");
}
}
Otro ejemplo en el que se leen líneas completas. En este caso utilizamos BufferedReader
public static void main(String[] args) {
try (var in = new BufferedReader(new FileReader("datos.txt"))) {
String cadena = in.readLine();
while (cadena != null) {
System.out.println(cadena);
cadena = in.readLine();
}
} catch (FileNotFoundException e) {
System.out.println("ERROR. Archivo no encontrado");
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
Lectura de ficheros de texto con Scanner¶
A partir de Java 5 se puede leer un fichero de texto utilizando la clase Scanner igual que si
leyéramos por teclado. Para ello se le pasa al constructor de Scanner el objeto FileReader
asociado al fichero. Esta operación lanza una excepción FileNotFoundException
.
Lectura de un fichero de texto con una serie de enteros separados por secuencias de espacios y tabuladores, incluso en líneas distintas
12 34 56 32 43
public static void main(String[] args) {
/*
Creamos el flujo de texto a partir del nombre del archivo. Como
Dentro del bloque try solo se va a abrir el archivo y no se va a leer
de él, basta con la excepción FileNotFoundException
*/
try(FileInputStream flujo = new FileInputStream("datos.txt");
var sc = new Scanner(flujo);) {
while (sc.hasNext()) { // en principio, no sabemos cuántos números hay
int n = sc.nextInt();
System.out.print(n + " "); // vamos mostrando los números leídos
}
} catch (FileNotFoundException e) {
System.out.println("ERROR. Archivo no encontrado");
} catch (IOException e) {
System.out.println("ERROR de E/S");
}
}