java - libreria - Diferencia específica entre bufferedreader y filereader
java bufferedreader java 8 (6)
Me gustaría saber la diferencia específica entre BufferedReader
y FileReader
.
Sé que BufferedReader
es mucho más eficiente que FileReader
, pero ¿puede alguien explicar por qué (específicamente y en detalle)? Gracias.
BufferedReader requiere un Reader, del cual FileReader es uno: desciende de InputStreamReader, que desciende de Reader.
Bufferedreader: método que puede utilizar en realidad como sustituto del método de escáner, obtiene el archivo, obtiene la entrada.
FileReader - como su nombre lo sugiere.
FileReader - leer archivos de caracteres
BufferedReader - "Lee texto de un flujo de entrada de caracteres, almacena en búfer los caracteres para proporcionar una lectura eficiente de caracteres, matrices y líneas".
http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html
http://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html
En realidad, BufferedReader hace uso de lectores como FileReader.
La clase FileReader ayuda a escribir en el archivo, pero su eficiencia es baja, ya que recupera un carácter a la vez desde el archivo, pero BufferedReader toma fragmentos de datos y los almacena en el búfer, por lo que en lugar de recuperar un carácter en un momento desde el archivo, es más fácil usar el búfer .
Primero, debe entender el "streaming" en Java porque todos los "lectores" en Java se basan en este concepto.
Transmisión de archivos
La transmisión de archivos se realiza mediante el objeto FileInputStream en Java.
// it reads a byte at a time and stores into the ''byt'' variable
int byt;
while((byt = fileInputStream.read()) != -1) {
fileOutputStream.write(byt);
}
Estos objetos realmente leen un byte (8 bits) a la vez y lo escriben en el archivo dado.
Una aplicación práctica y útil sería trabajar con archivos binarios / 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, ya que recorrer un byte a la vez, luego procesar y almacenar el byte procesado es tedioso y requiere mucho tiempo.
También debe proporcionar el conjunto de caracteres del archivo de texto, es decir, si los caracteres están en latín o chino , etc. De lo contrario, el programa descodificaría y codificaría 8 bits a la vez y vería caracteres extraños impresos en la Pantalla o escrito en el archivo de salida (si un char tiene más de 1 byte de longitud).
Lectura de archivos
Esta es solo una forma elegante de decir "Transmisión de archivos" con soporte de juego de caracteres incluido (es decir, no es necesario definir el juego de caracteres, como anteriormente)
La clase FileReader está diseñada específicamente para tratar con archivos de texto. Como ha visto anteriormente, el archivo Streaming es el mejor para tratar con datos binarios en bruto, pero por el bien del texto, no es tan eficiente.
Así que los Java-dudes agregaron la clase FileReader , para tratar específicamente con los archivos de texto. Lee 2 bytes (o 4 bytes, depende del conjunto de caracteres) a la vez. Una mejora notablemente grande sobre el FileInputStream anterior !!
así que la operación de transmisión es así,
int c;
while ( (c = fileReader.read()) != -1) { // some logic }
Tenga en cuenta que ambas clases utilizan una variable de entero para almacenar el valor recuperado del archivo de entrada (por lo que cada carácter se convierte en un entero al recuperarlo y luego se vuelve al carácter mientras se almacena).
La única ventaja aquí es que, dado que esta clase trata con los archivos de texto, no tiene que especificar el conjunto de caracteres del archivo de texto y algunas otras propiedades. Básicamente, proporciona una solución lista para usar, para la mayoría de los casos de procesamiento de archivos de texto. También apoya la internacionalización y la localización.
Pero, de nuevo, sigue siendo demasiado lento (¡Imaging lee 2 bytes a la vez y lo recorre!).
Arroyos amortiguadores
Para abordar el problema del bucle continuo en un byte o 2. Los Java-dudes agregaron otra funcionalidad espectacular. "Para crear un búfer de datos, antes de procesar".
El concepto es bastante parecido cuando un usuario transmite un video en YouTube. Un video se almacena en búfer antes de reproducirlo, para brindar una experiencia de visualización de video impecable. (Por lo tanto, el navegador mantiene el almacenamiento en búfer hasta que todo el video se almacena antes de tiempo). La clase BufferedReader utiliza la misma técnica.
El objeto BufferedReader toma un objeto FileReader como una entrada que contiene toda la información necesaria sobre el archivo de texto que debe leerse. (como la ruta del archivo y el conjunto de caracteres.)
BufferedReader br = new BufferedReader( new FileReader("example.txt") );
Cuando se da la instrucción de "lectura" al objeto BufferedReader , utiliza el objeto FileReader para leer los datos del archivo. Cuando se da una instrucción, el objeto FileReader lee 2 (o 4) bytes a la vez y devuelve los datos al BufferedReader y el lector continúa haciendo eso hasta que golpea ''/ n'' o ''/ r / n'' (el final de el símbolo de la línea). Una vez que una línea está en búfer, el lector espera pacientemente, hasta que se da la instrucción de amortiguar la siguiente línea.
Mientras tanto, el objeto BufferReader crea un lugar de memoria especial (en la RAM), llamado "Buffer", y almacena todos los datos obtenidos del objeto FileReader .
// 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 a la vez, se obtiene una línea completa y se almacena en la RAM en algún lugar, y cuando termina de procesar los datos, puede almacenar toda la línea en el disco duro. Por lo tanto, hace que el proceso se ejecute mucho más rápido que haciendo 2 bytes por vez.
Pero, una vez más, ¿por qué necesitamos pasar el objeto FileReader al BufferReader? ¿No podemos simplemente decir "almacenar este archivo" y BufferReader se encargaría del resto? ¿No sería eso dulce?
Bueno, la clase BufferReader se crea de manera que solo sepa cómo crear un búfer y almacenar los datos entrantes. No importa el objeto del que provienen los datos.
Dicho esto, cuando proporciona el objeto FileReader como entrada, almacena el archivo de la misma manera, si proporciona el InputStreamReader como un objeto, almacena los datos de entrada de la Terminal / Consola hasta que llega a un nuevo símbolo de línea. como,
// Object that reads console inputs
InputStreamReader console = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(console);
System.out.println(br.readLine());
De esta manera, puede leer (o almacenar en búfer) múltiples transmisiones con la misma clase BufferReader , como archivos de texto, consolas, impresoras, datos de redes, etc., y todo lo que debe recordar es:
bufferedReader.readLine();
para imprimir lo que hayas almacenado en búfer.
De manera simple:
Una clase FileReader es una herramienta general para leer caracteres de un archivo. La clase BufferedReader puede envolver a los lectores, como FileReader, para amortiguar la entrada y mejorar la eficiencia. Por lo tanto, no utilizarías uno sobre el otro, sino ambos al mismo tiempo pasando el objeto FileReader al constructor BufferedReader.
Muy detalle
FileReader se utiliza para la entrada de datos de caracteres de 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 convierte automáticamente los caracteres del formato de archivo de disco al formato de carácter interno. Los caracteres del 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.
Al igual que con la salida, es una buena práctica usar un búfer para mejorar la eficiencia. Utilice BufferedReader para esto. Esta es la misma clase que hemos estado usando para la entrada de teclado. Estas líneas deben parecer familiares:
BufferedReader stdin =
new BufferedReader(new InputStreamReader( System.in ));
Estas líneas crean un BufferedReader, pero lo conectan a una secuencia de entrada desde el teclado, no a un archivo.
Fuente: http://www.oopweb.com/Java/Documents/JavaNotes/Volume/chap84/ch84_3.html