example definicion java buffer bufferedreader

definicion - ¿Qué significa exactamente "Stream" y "Buffer" en Java I/O?



filereader java (5)

Bueno, es una pregunta en la mente de todos que comienzan a trabajar en el paquete java.io. Para responder a los términos de su pregunta, InputStreamReader y BufferedReader representan solo los objetos java (no hay nada especial en ellos) pero se crean para operaciones como leer y escribir desde / hacia diferentes entradas / salidas como archivo, objeto, etc.

Ahora vamos a alinear

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

InputStreamReader es la clase para leer la secuencia de entrada de bytes. Pero leer cada byte es una operación costosa, por lo que lo estamos envolviendo alrededor de BufferedReader para que tenga un búfer (que es un patrón de decorador)

Entonces, lo que sucederá es que incluso antes de comenzar a leer, bufferReader almacenará algunos trozos de bytes en el registro y cuando se realiza la operación de lectura. se leerá desde esa ubicación, que es mucho menos costosa que la lectura desde consola / archivo. Pero en el caso de InputStreamReader, cuando se realiza la operación de lectura cada vez que se lleva a cabo la operación de acceso al disco

Acabo de aprender sobre entrada / salida usando BufferedReader .

Quería saber cuáles son exactamente los significados del término Stream and Buffer .

Además, ¿qué nos sirve esta línea de código?

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


Java tiene dos tipos de clases de entrada y salida (E / S): secuencias y lectores / escritores .

Las InputStream ( InputStream , OutputStream y todo lo que las amplíe) son para leer y escribir datos binarios de archivos, la red o cualquier otro dispositivo.

Los lectores y escritores son para leer y escribir textos (caracteres). Son una capa en la parte superior de las secuencias, que convierte datos binarios (bytes) a caracteres y viceversa, utilizando una codificación de caracteres .

Leer datos del disco byte a byte es muy ineficiente. Una forma de acelerarlo es utilizar un búfer: en vez de leer un byte a la vez, lee miles de bytes a la vez y los pone en un búfer en la memoria. Luego puede ver los bytes en el buffer uno por uno.

El tutorial de Oracle sobre la E / S de Oracle lo explica en detalle.

Mirando la línea de código que proporcionó:

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

System.in es un InputStream . Crea un InputStreamReader que lee bytes de System.in . Luego envuelve eso en un BufferedReader .

Entonces, al final, tiene un BufferedReader que lee desde un InputStreamReader que lee desde System.in .


Una transmisión es la conexión y la información real que se pasa entre los puntos. El búfer es un contenedor de almacenamiento que almacena parte o la totalidad de los datos transmitidos y lo envía al dispositivo de salida.

Por supuesto, el punto es que si la transmisión disminuye más allá de la velocidad de datos requerida para mostrar los datos, la salida se detendrá. El buffer evita esto.


Buffer:

Es una región de almacenamiento de memoria física que se usa para almacenar temporalmente datos mientras se mueven de un lugar a otro. Ese almacenamiento de memoria física sería RAM (memoria de acceso aleatorio) en la mayoría de los casos.

Pero desde el contexto de esta pregunta, Buffer se usa al leer / escribir datos. No es necesario usarlo mientras se mueven datos de un lugar a otro.

Ejemplo para el búfer: si su sistema tiene 4 GB de RAM, el sistema podría asignar 4 KB de memoria (RAM) para el Buffer . KB - Kilobyte (s), GB - Gigabyte (s)

I / O Stream (o) Stream:

I / O Stream representa una fuente de entrada o un destino de salida. Una secuencia puede representar muchos tipos diferentes de fuentes y destinos, incluidos archivos de disco, dispositivos, otros programas y matrices de memoria.

I / O significa entrada / salida.

Entonces, Input Stream puede ser una fuente de entrada como un archivo de disco, una conexión de red, etc.

Y, Output Stream puede ser un destino de salida como archivo de disco, conexión de red, etc.

Según la documentación oficial de JAVA , los flujos son de 3 tipos.

  1. Byte Streams (Bytes de lectura o escritura)
  2. Cadenas de caracteres (leer o escribir caracteres)
  3. Flujos almacenados en búfer (leer desde, o escribir en, Buffer para mayor eficiencia)

Byte Streams:

Realizan entradas y salidas de bytes de 8 bits. Todas las clases de flujo de bytes se descienden de InputStream y OutputStream .

Las clases de flujo de entrada de bytes obtienen entrada como bytes sin formato . Las clases de flujo de salida de bytes dan salida como bytes sin formato .

InputStream - Subclases directas conocidas

AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.

OutputStream - Subclases directas conocidas

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

Flujos de caracteres: son una capa en la parte superior de Byte Streams. Convierten bytes (datos binarios) a caracteres y caracteres a bytes, utilizando una codificación de caracteres.

Todas las clases de secuencia de caracteres descienden de Reader y Writer .

Reader - Subclases directas conocidas

BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

Writer - Subclases directas conocidas

BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter

Byte Streams y Character Streams usan E / S sin búfer .

Esto significa que cada solicitud de lectura o escritura es manejada directamente por el SO subyacente. Esto puede hacer que un programa sea mucho menos eficiente, ya que cada una de esas solicitudes a menudo desencadena el acceso al disco, la actividad de la red o alguna otra operación que es relativamente costosa. Para reducir este tipo de sobrecarga, la plataforma Java implementa flujos de E / S en búfer.

Flujos almacenados en búfer:

Las secuencias de entrada almacenadas en buffer leen datos desde un área de memoria conocida como buffer ; la API de entrada nativa se invoca solo cuando el búfer está vacío.

De manera similar, los flujos de salida almacenados en el búfer escriben datos en un búfer y solo se llama a la API de salida nativa cuando el búfer está lleno.

Un programa puede convertir una secuencia sin búfer en una secuencia en búfer utilizando la expresión de ajuste, donde el objeto de flujo sin búfer se pasa al constructor para una clase de flujo en búfer .

Ejemplo:

inputStream = new BufferedReader(new FileReader("xanadu.txt")); outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));

Hay 4 clases de flujo en búfer que se usan para envolver flujos sin búfer:

Para crear flujos de bytes almacenados en búfer , utilice las clases BufferedInputStream y BufferedOutputStream .

Para crear secuencias de caracteres con búfer , utilice las clases BufferedReader y BufferedWriter .


Flujos : Los flujos son flujos de datos de los que puede leer o escribir. las transmisiones generalmente se conectan a una fuente de datos, o un destino de datos, como un archivo, una conexión de red, etc.

Buffer : contenedor para datos de un tipo primitivo específico. Un buffer es una secuencia lineal y finita de elementos de un tipo primitivo específico. Además de su contenido, las propiedades esenciales de un buffer son su capacidad, límite y posición: