2012-03-10 7 views

Respuesta

66

de una manera sencilla:

clase A FileReader es una herramienta general para leer en caracteres de un archivo. La clase BufferedReader puede envolver a los lectores, como FileReader, para proteger la entrada y mejorar la eficiencia. Por lo tanto, no usaría uno sobre el otro, sino que ambos al mismo tiempo pasarían el objeto FileReader al constructor BufferedReader.

Muy Detalle

FileReader se utiliza para la entrada de datos de caracteres desde un archivo de disco. El archivo de entrada puede ser un ASCII ordinario, un byte por archivo de texto de caracteres. Una secuencia de Reader traduce automáticamente los caracteres del formato de archivo de disco en el formato de char interno. Los caracteres en el archivo de entrada pueden ser de otros alfabetos compatibles con el formato UTF, en cuyo caso habrá hasta tres bytes por carácter. En este caso, también, los caracteres del archivo se traducen al formato char.

enter image description here

Al igual que con la producción, es una buena práctica usar un tampón para mejorar la eficiencia. Use BufferedReader para esto. Esta es la misma clase que hemos estado usando para la entrada de teclado. Estas líneas deben resultar familiar:

BufferedReader stdin = 
    new BufferedReader(new InputStreamReader(System.in)); 

Estas líneas crean un BufferedReader, pero conectarlo a un flujo de entrada desde el teclado, no en un archivo.

Fuente: http://www.oopweb.com/Java/Documents/JavaNotes/Volume/chap84/ch84_3.html

-2

Bufferedreader: método que puede utilizar realmente como sustituto del método de escáner, obtiene archivos y recibe información.

FileReader - como su nombre indica.

0

BufferedReader requiere de un lector, de los cuales uno es FileReader - desciende de InputStreamReader, que desciende del lector.

-1

La clase FileReader ayuda a escribir en el archivo, pero su eficacia es baja ya que ha recuperado un carácter a la vez del archivo, pero BufferedReader toma fragmentos de datos y los almacena en el búfer, así que en lugar de recuperarlos. se vuelve fácil usando el buffer.

63

En primer lugar, debe comprender la transmisión en Java porque todos los "lectores" en Java se basan en ese concepto.

archivo de transmisión

de streaming de archivos se lleva a cabo por el objeto FileInputStream en Java.

// it reads one byte at a time and stores into the 'byt' variable 
int byt; 
while((byt = fileInputStream.read()) != -1) { 
    fileOutputStream.write(byt); 
} 

Esta objetos realmente lee un byte (8 bits) a la vez y lo escribe en el archivo dado.

Una aplicación práctica sería, cuando trabaje con los archivos binarios/de datos en bruto, como imágenes o archivos de audio (use AudioInputStream en lugar de FileInputStream para archivos de audio). Por otro lado, para los archivos de texto, es muy incómodo y más lento, porque recorrer un byte a la vez, luego procesar y almacenar el byte es tedioso y consume mucho tiempo.

también es necesario para proporcionar el juego de caracteres (si los personajes son América o china, etc.) del archivo de texto, que se está tratando, para la codificación y decodificación eficiente, de lo contrario, el programa se decodifica y codifica algunos jibberish y verás todos los símbolos extraños escritos en tu archivo de texto.

archivo de lectura

Esto es sólo una forma elegante de decir "streaming de archivos" con el apoyo del juego de caracteres.

La clase FileReader está diseñada específicamente para trabajar con archivos de texto. Como puede ver anteriormente, el archivo Streaming es el mejor para tratar con los datos binarios en bruto, pero por el bien del texto, no es eficiente.

Así que los chicos de Java agregaron la clase FileReader, para ocuparse específicamente de los archivos de texto. Se lee 2 bytes a la vez (una gran mejora sobre el FileInputStream !! Yo diría que sigue siendo mejor opción entonces la transmisión de un byte.)

lo que la operación es como,

int c; 
while ((c = fileReader.read()) != -1) { // some logic } 

Tenga en cuenta Ambas instancias usan una variable entera para almacenar el valor recuperado del archivo de entrada.

La única ventaja es que, dado que esta clase se ocupa de los archivos de texto, no es necesario especificar el conjunto de caracteres del archivo de texto y algunas otras propiedades. Básicamente proporciona una solución lista para usar, en la mayoría de los casos. También es compatible con la internacionalización y localización.

Pero, de nuevo, es mucho más lento (¡Imagine que lee 2 bytes por vez y lo repite!).

búfer arroyos

Para abordar el problema de bucle continuo a lo largo de un byte o 2. Los chicos Java añadió una funcionalidad extraordinaria. "Para crear un búfer, antes de procesarlo."

El concepto es muy parecido al de un usuario que transmite un video en YouTube. Un video almacena antes de reproducir para que la persona tenga una experiencia impecable de reproducción de video (y mantiene el almacenamiento en búfer hasta tiempo, mientras observa.)

la misma técnica es utilizada por el clase BufferedReader, la objeto BufferedReader toma FileReader objeto que contiene toda la información sobre el archivo de texto que debe ser leído.

El objeto BufferReader utiliza el objeto Filereader para leer el archivo de texto proporcionado. Cada vez que el FileReader lee 2 bytes del archivo de texto, devuelve los datos al objeto BufferReader. Ahora, el objeto BufferReader también crea un lugar de memoria especial, llamado "Buffer", y almacena allí todos los datos almacenados en el búfer.

BufferedReader br = new BufferedReader(new FileReader("example.txt")); 

El proceso de lectura de 2 bytes de un tiempo, deja de repetir hasta que los FileReader accesos de objeto, '\ n', '\ r \ n' (A carácter de nueva línea), y BufferReader paradas buffering . Hasta que se da la instrucción de leer la siguiente línea (precisamente para almacenar la próxima línea).

// this variable points to the buffered line 
String line; 

// Keep buffering the lines and print it. 
while ((line = br.readLine()) != null) { 
    printWriter.println(line); 
} 

Ahora aquí, en lugar de leer 2 bytes, y luego hacer un poco de magia y luego almacenar de nuevo, una línea entera se trae y se almacena en la memoria RAM en algún lugar, y cuando haya terminado con la magia, se puede almacenar el toda la línea de vuelta. Por lo tanto, hace que el proceso sea mucho más rápido que hacer los 2 bytes por vez.

Pero, nuevamente, ¿por qué tenemos que pasar el objeto FileReader al BufferReader? ¿No podemos simplemente decir "búfer este archivo" y lo hace, no sería dulce y corto?

La forma en que funciona es la siguiente, la clase es una clase BufferReader tonto que sólo sabe cómo buffer, que no tiene ni idea de lo que para amortiguar o simplemente no le importa. Así se dice que, si les proporciona FileReader, que amortigua un archivo, de la misma manera si se proporciona un objeto de InputStreamReader tales como,

// Object that reads console inputs 
InputStreamReader console = new InputStreamReader(System.in); 
BufferedReader br = new BufferedReader(console); 
System.out.println(br.readLine()); 

Se explorará los datos de entrada de terminal/consola hasta que llega un nuevo símbolo de línea y almacena la línea escaneada en el búfer.

Así que ya saben que se puede leer (buffer) de múltiples flujos con el clase BufferReader, tales como archivos de texto, consolas, impresoras, redes de datos, etc., y todo lo que él/ella tiene que recordar es,

bufferedReader.readLine(); 

para imprimir lo que está almacenando en el búfer.

+4

¡Gran explicación! – JavaDeveloper

+1

gracias! ¡Estaba tratando de explicar algunos conceptos complejos! :) –

+0

Explicación realmente agradable, despejó completamente mis dudas. :) –

Cuestiones relacionadas