2011-12-01 16 views
6

? Tengo que entender la diferencia entre estas dos clases y cómo funcionan entre sí. Entiendo que FileReader lee caracteres de un archivo de a un carácter a la vez y BufferedReader lee una gran cantidad de datos y los almacena en un búfer, lo que lo hace más rápido.¿Qué espera un constructor de BufferedReader un FileReader

Para usar un BufferedReader, tengo que proporcionarle un FileReader. ¿Cómo utiliza la clase BufferedReader el FileReader si lee el archivo de manera diferente? ¿Significa que BufferedReader usa FileReader y, por lo tanto, detrás de escena, los personajes aún se leen de a un personaje a la vez? Supongo que mi pregunta es cómo utiliza la clase BufferedReader la clase FileReader.

+0

No debería preocuparse por cómo funciona. Sepa que sí y que probablemente sea mucho más eficiente que cualquier otra cosa que pueda inventar usted mismo. Y si insistes en saber cómo funciona en detalle, ve y mira en el código fuente. –

Respuesta

5

En primer lugar, BufferedReader lleva un Reader, no un FileReader (aunque este último es aceptado).

La clase abstracta Reader tiene varios métodos read(). Hay una versión de un solo carácter y dos versiones que leen un bloque de caracteres en una matriz.

Tiene sentido usar BufferedReader si lee caracteres individuales o pequeños bloques a la vez.

considerar las siguientes dos preguntas:

char ch1 = fileReader.read(); 
char ch2 = bufferedReader.read() 

El primero será ir al archivo subyacente, mientras que el segundo es muy probable que estar satisfechos del buffer interno del BufferedReader 's.

2

Un FileReader tiene la capacidad de leer fragmentos, no solo 1 carácter a la vez. Hereda los métodos de lectura (char []) de Reader para que pueda leer hasta el tamaño de la matriz char [] que transfiere. El BufferedReader simplemente ajusta el FileReader para que cuando llame a los métodos read() en BufferedReader, maneja los buffers internamente y llama a los métodos read() en su Reader subyacente. Una de las principales razones por las que usaría un BufferedReader es para poder usar el método readLine(). Un BufferedReader puede incluir otros lectores además de un FileReader (como InputStreamReader).

+0

El concepto de un BufferedReader 'envolviendo' un FileReader es importante. Como se mencionó en la última línea, un BufferedReader también puede incluir otros tipos de lectores como InputStreamReader ** y ** también se puede encerrar. Esto se llama [Patrón Decorador] (http: //en.wikipedia.org/wiki/Decorator_pattern) Permite que se agregue una funcionalidad/comportamiento adicional a un objeto dinámicamente. – phuibers

6

BufferedReader utiliza el método FileReader.read(char[] cbuf, int off, int len) que también puede leer si desea obtener más de un carácter a la vez.

El BufferedReader hace que sea más fácil de leer el tamaño que desea y aún así ser eficiente. Si siempre está leyendo bloques grandes, puede ser un poco más eficiente soltar el BufferedReader.

2

El BufferedReader agrega una capa de almacenamiento en búfer en la parte superior de cualquier lector. El punto es hacer que la lectura sea más óptima en comparación con la lectura de un archivo, zócalo o algo de una manera no búfer. También agrega algunos métodos convenientes que no funcionarían muy bien a menos que obtuviera previamente un fragmento para usted. En el caso de FileReader, debe leer un fragmento de datos hasta que encuentre un '\ n' para poder hacer algo como BufferedReader.readLine() y luego deberá guardar el resto de los datos para la siguiente operación de lectura (sin mencionar el trabajo necesario cuando tiene que esperar que una fuente de datos lenta se lo entregue todo).

Cuestiones relacionadas