Java tiene dos tipos de clases para entrada y salida (E/S):
- flujos. Flujos (
InputStream
,OutputStream
y todo lo que extiende estos) son para leer y escribir datos binarios de archivos, la red, o cualquier otro dispositivo.
- lectores/escritores. Los lectores y escritores son para leer y escribir texto (caracteres). Son una capa en la parte superior de los flujos, que convierte los datos binarios (bytes) a caracteres y viceversa, utilizando un carácter encoding .
La lectura de datos del disco byte-by-byte es muy ineficiente.
Una forma de acelerarlo es usar un búfer: en lugar de leer un byte a la vez, lee unos pocos miles de bytes a la vez y los coloca en un búfer, en la memoria.
Luego puedes mirar los bytes en el búfer uno por uno.
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
InputStreamReader y BufferedReader representan solo los objetos java y se crean para operaciones io como leer y escribir desde/hacia diferentes entradas/salidas como archivo, objeto, etc.
En el ejemplo de arriba InputStreamReader es la clase para leer el flujo de entrada de bytes. Pero leer cada byte es una operación costosa así que lo estamos envolviendo alrededor de BufferedReader para tenerlo buffered (que es el patrón de decorador)
Lo que sucederá es que incluso antes de comenzar a leer, BufferedReader almacenará algunos fragmentos de bytes en el registro y cuando realice la operación de lectura, se leerá desde esa ubicación, que es mucho menos costosa que la lectura desde la consola/archivo, pero en el caso de InputStreamReader, cuando realice la operación de lectura cada vez que se realice la operación de acceso al disco.
De acuerdo con la documentación oficial de JAVA , los flujos son de 3 tipos.
- Flujos de bytes (leer o escribir Bytes)
- Flujos de caracteres (leer o escribir caracteres)
- Flujos en búfer (leer desde, o escribir en, Buffer para la eficiencia)
Flujos 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 crudos. Las clases de flujo de salida de bytes dan salida como bytes crudos.
InputStream
– Directo Conocido Subclases
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 en la parte superior de los flujos de bytes. Convierten bytes (datos binarios) a caracteres y caracteres a bytes, usando 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
– Directo Conocido Subclases
BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter
Flujos de bytes y Flujos de caracteres utilizan E/S sin búfer.
Esto significa que cada solicitud de lectura o escritura se maneja directamente por el sistema operativo subyacente. Esto puede hacer que un programa sea mucho menos eficiente, ya que cada solicitud a menudo desencadena el acceso al disco, la red actividad, o alguna otra operación que sea relativamente costosa. Para reducir este tipo de sobrecarga, la plataforma Java implementa buffered E / S flujo.
Flujos en búfer:
Flujos de entrada en búfer leer datos de un área de memoria conocida como búfer ; la API de entrada nativa solo se llama cuando el búfer está vacío.
De manera similar, los flujos de salida 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 un flujo sin búfer en un flujo en búfer usando el modismo wrapping, donde el objeto stream unbuffered se pasa al constructor para una clase stream buffered.
Ejemplo:
inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
Hay 4 clases de flujo con búfer que se utilizan para envolver flujos sin búfer:
Para crear amortiguado Los flujos de bytes usan, BufferedInputStream
y BufferedOutputStream
clases.
Para crear en búfer Carácter Arroyos use, BufferedReader
y BufferedWriter
clases.
Streams: Los Streams son flujos de datos desde los que se puede leer o escribir. los flujos suelen estar conectados a una fuente de datos o destino de datos, como un archivo, una conexión de red, etc.
Buffer: Un contenedor para datos de un tipo primitivo específico. Un búfer es una secuencia lineal, finita de elementos de un tipo primitivo específico. Aparte de su contenido, las propiedades esenciales de un búfer son su capacidad, límite y posición.
Más información: