Dominando BufferedInputStream de Java: Lectura Eficiente de Bytes y Métodos Avanzados
Resumen de la Clase BufferedInputStream de Java
Este tutorial cubre la clase BufferedInputStream de Java, sus métodos clave y ejemplos prácticos para mejorar el rendimiento de I/O de archivos.
La clase BufferedInputStream en el paquete java.io mejora los flujos de entrada a nivel de byte añadiendo un búfer interno, permitiendo lectura de datos más rápida y eficiente.
Extiende la clase abstracta InputStream.
Cómo Funciona BufferedInputStream
BufferedInputStream mantiene un búfer interno de 8,192 bytes por defecto. Cuando se solicita una operación de lectura, se obtiene un bloque de bytes del flujo subyacente (típicamente un archivo) y se almacena en este búfer. Las llamadas de lectura subsiguientes consumen bytes del búfer hasta que se agota, momento en el que se carga otro bloque. Esto reduce el costoso I/O de disco y acelera el consumo de datos.
Crear un BufferedInputStream
Para crear un BufferedInputStream, primero importa la clase:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
Luego, instáncialo envolviendo un flujo de nivel inferior como FileInputStream:
FileInputStream archivo = new FileInputStream("ejemplo.txt");
BufferedInputStream buffer = new BufferedInputStream(archivo);
Opcionalmente, especifica un tamaño de búfer personalizado:
int tamañoBuffer = 16_384; // 16 KB
BufferedInputStream buffer = new BufferedInputStream(archivo, tamañoBuffer);
Cuanto mayor sea el búfer, menos accesos a disco se requieren—útil para archivos grandes o flujos de red.
Métodos Principales de BufferedInputStream
read()
int read()– lee un solo byte y lo retorna como entero (0–255) o-1si se alcanza el final del flujo.int read(byte[] b)– lee hastab.lengthbytes en el array.int read(byte[] b, int off, int len)– lee hastalenbytes enbcomenzando en el offsetoff.
Ejemplo: Leyendo un archivo de texto byte a byte e imprimiéndolo en la consola.
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class Main {
public static void main(String[] args) {
try (BufferedInputStream in = new BufferedInputStream(new FileInputStream("input.txt"))) {
int byteLeido;
while ((byteLeido = in.read()) != -1) {
System.out.print((char) byteLeido);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Salida:
Esta es una línea de texto dentro del archivo.
available()
El método available() informa el número de bytes que se pueden leer del flujo sin bloqueo. Esto puede ayudar a medir el progreso al procesar flujos grandes.
FileInputStream archivo = new FileInputStream("input.txt");
BufferedInputStream buffer = new BufferedInputStream(archivo);
System.out.println("Bytes disponibles: " + buffer.available());
// ... leer datos
System.out.println("Bytes restantes: " + buffer.available());
buffer.close();
skip(long n)
Usa skip() para omitir un número especificado de bytes. Retorna el número real de bytes omitidos, que puede ser menor al solicitado si se alcanza el final del flujo.
buffer.skip(5); // omitir primeros 5 bytes
close()
Siempre cierra el flujo (preferiblemente usando un bloque try-with-resources) para liberar recursos del sistema. Después de cerrar, el flujo no puede reutilizarse.
Otros Métodos Notables
| Método | Descripción |
|---|---|
mark(int readLimit) | Marca la posición actual en el flujo. Llamadas subsiguientes a reset() retornarán a este punto, siempre que no se hayan leído más de readLimit bytes. |
reset() | Reposiciona el flujo a la última posición marcada. |
Para una referencia completa, consulta la documentación oficial de Java.
Java
- Palabra clave final en Java: Variables, métodos y clases
- Operador instanceof en Java: Guía completa
- Dominando la herencia en Java: Conceptos, tipos y ejemplos prácticos
- Entendiendo las clases anidadas estáticas en Java: Uso, diferencias y ejemplos
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
- Dominando la Reflexión en Java: Inspeccionando clases, métodos y campos en tiempo de ejecución
- Dominando ObjectOutputStream de Java: Serialización, Métodos y Ejemplos Prácticos
- Dominando Java BufferedReader: Manejo Eficiente de Flujos de Caracteres
- Dominando Java Generics: Construyendo Código Reutilizable y Type-Safe
- Dominando las operaciones de archivos en Java con java.io: creación, lectura, escritura y eliminación