Saltar la navegación

3.2.- Flujos basados en caracteres.

Se ve una pared en una calle, con muchas líneas o flujos de escritura en caracteres parecidos a los japoneses o chinos.

Para los flujos de caracteres, Java dispone de dos clases abstractas: Reader y Writer.

Si se usan sólo FileInputStream, FileOuputStream, FileReader o FileWriter, cada vez que se efectúa una lectura o escritura, se hace físicamente en el disco duro. Si se leen o escriben pocos caracteres cada vez, el proceso se hace costoso y lento por los muchos accesos a disco duro.

Los BufferedReader, BufferedInputStream, BufferedWriter y BufferedOutputStream añaden un buffer intermedio. Cuando se lee o escribe, esta clase controla los accesos a disco. Así, si vamos escribiendo, se guardarán los datos hasta que haya bastantes datos como para hacer una escritura eficiente.

Al leer, la clase leerá más datos de los que se hayan pedido. En las siguientes lecturas nos dará lo que tiene almacenado, hasta que necesite leer otra vez físicamente. Esta forma de trabajar hace los accesos a disco más eficientes y el programa se ejecuta más rápido.

Además FileReader no contiene métodos que nos permitan leer líneas completas, pero sí BufferedReader. Afortunadamente, podemos construir un BufferedReader a partir del FileReader de la siguiente manera:
File archivo = new File ("C:\\archivo.txt");
FileReader fr = new FileReader (archivo);
BufferedReader br = new BufferedReader(fr);
...
String linea = br.readLine();
Ejemplo: lectura de un fichero
En este ejemplo leemos caracteres hasta llegar al fin de archivo (EOF o End Of File) del flujo.
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class LeerFichEOF {
	public static void main (String args[]) throws IOException {
		    BufferedReader br = new BufferedReader(new FileReader("origen.txt")) ;
		    int codigo = br.read();//lee el primer caracter 
		    char caracter;
	    //mientras el código no sea -1 (EOF) continuo leyendo
		    while (codigo != -1) { 
		        caracter = (char) codigo; //casting
		        System.out.print(caracter);
		        codigo = br.read(); //lee un caracter 
		    		}
        }
}

Para saber más

En este enlace puedes aprender más sobre internacionalización y Unicode.

Autoevaluación

Pregunta 1

Mediante las clases que proporcionan buffers se pretende que se hagan lecturas y escrituras físicas a disco, lo antes posible y cuantas más mejor.