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