Buffer:
Es una región de un almacenamiento de memoria física que se utiliza para almacenar datos temporalmente 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 utilizarlo al mover datos de un lugar a otro.
Ejemplo de búfer: si su sistema tiene 4 GB de RAM, el sistema podría asignar 4 KB de memoria (RAM) para búfer . KB - Kilobyte (s), GB - Gigabyte (s)
Secuencia de E / S (o) Secuencia:
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.
E / S significa Entrada / Salida.
Por lo tanto, 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 un archivo de disco, una conexión de red, etc.
Según la documentación oficial de JAVA , los Streams son de 3 tipos.
- Flujos de bytes (leer o escribir bytes)
- Flujos de caracteres (leer o escribir caracteres)
- Flujos almacenados en búfer (leer o escribir en búfer para mayor eficiencia)
Secuencias de bytes:
Realizan entrada y salida de bytes de 8 bits. Todas las clases de flujo de bytes descienden de InputStream y OutputStream .
Las clases de flujo de entrada de bytes obtienen la entrada como bytes sin procesar . Las clases de flujo de salida de bytes dan salida como bytes sin procesar .
InputStream
- Subclases conocidas directas
AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.
OutputStream
- Subclases conocidas directas
ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
Flujos de caracteres:
son una capa sobre los flujos de bytes. Convierten bytes (datos binarios) en caracteres y caracteres en bytes, utilizando una codificación de caracteres.
Todas las clases de flujo de caracteres descienden de Reader y Writer .
Reader
- Subclases conocidas directas
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
Writer
- Subclases conocidas directas
BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter
Los flujos de bytes y los flujos de caracteres utilizan E / S sin búfer .
Esto significa que cada solicitud de lectura o escritura es manejada directamente por el sistema operativo subyacente. Esto puede hacer que un programa sea mucho menos eficiente, ya que cada una de estas 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.
Secuencias almacenadas en búfer:
Los flujos de entrada almacenados en búfer leen datos de un área de memoria conocida como búfer ; la API de entrada nativa se llama solo cuando el búfer está vacío.
De manera similar, los flujos de salida almacenados en búfer escriben datos en un búfer y la API de salida nativa se llama solo cuando el búfer está lleno.
Un programa puede convertir una secuencia sin búfer en una secuencia con búfer usando el lenguaje de envoltura, donde el objeto de la secuencia sin búfer se pasa al constructor para una clase de secuencia con búfer .
Ejemplo:
inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
Hay 4 clases de secuencias almacenadas en búfer que se utilizan para envolver secuencias sin búfer:
Para crear secuencias de bytes almacenadas en búfer , utilice BufferedInputStream
y BufferedOutputStream
clases.
Para crear flujos de caracteres en búfer , utilice y clases.BufferedReader
BufferedWriter