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.
¡Gran explicación! – JavaDeveloper
gracias! ¡Estaba tratando de explicar algunos conceptos complejos! :) –
Explicación realmente agradable, despejó completamente mis dudas. :) –