Inicialmente cuando queremos leer un archivo externo, empleamos la clase InputStream, que si bien no puede por sí sola leer un archivo de bytes, lo hace a través de su clase hija FileInputStream, que es específica para lectura de archivos tipo byte.
Algo característico de la subclase FileInputStream, es que accede al archivo de byte en byte, de a un caracter por vez, lo que consume más recursos de la PC si el archivo a acceder es muy grande.
Para subsanar este inconveniente de rendimiento en la PC con archivos muy “pesados”, Java nos proporciona otra clase hija de InputStream: BufferedInputStream.
Para utilizar esta clase debemos importar el paquete en la primera línea de código, de esta forma:
import java.io*.;
El objetivo principal de esta clase es hacer más eficiente la lectura de un flujo de datos proveniente de un medio externo, sea un archivo, una entrada de datos por teclado, etc.
Esta clase no accede byte a byte al contenido del medio externo, como en el caso anterior, sino que trata la información como a grupos de bytes y no a nivel caracteres, esto implica que lee una porción de bytes de un archivo y escribe esa porción sobre una zona de memoria, cuando esa zona se llena o queda vacía porque ya se ha accedido a la información, vuelven a realizarse las operaciones de entrada/salida.
BufferedInputStream, es una clase concreta, es decir que no es abstracta, y puede ser instanciada, en contraposición a la clase InputStream que no puede instanciarse.
Además, esta clase no trabaja con ficheros, su tarea es “envolver” un InputStream para el que se ha generado un objeto que recibe el contenido del archivo al cual accede la subclase FileInputStream.
InputStream fichero = new FileInputStream("miarchivo.txt");
BufferedInputStream ficheroBuffer = new BufferedInputStream(fichero);
Lo que hace BufferedInputStream es llamar al SO una vez y recolectar una porción de bytes en un buffer (una especie de “Array”), cuando el método .read() lo solicita ya no tiene que acceder al sistema operativo, sino que nos devuelve de a poco la información contenida en su buffer, por lo tanto, se reduce el número de comunicaciones con el disco.
El buffer es un archivo que sirve de transición entre el medio al que se accede y Java.
Java accede al buffer para cargar o descargar un archivo de a poco.
Los buffers funcionan como una alternativa a los procedimientos de entrada y salida.
Almacenan datos para ser accedidos con más eficacia. Son subclases de clases básicas.
Nota:Al derivar de las clases InputStream y FileInputStream, lanza las mismas excepciones y por lo tanto debemos capturarlas con un bloque try-catch
import java.io.*;
public class bufferinputstream {
public static void main(String[] args) {
try { //captura del exception correspondiente a FileInputStream
InputStream fichero = new FileInputStream("miarchivo.txt");
BufferedInputStream ficheroBuffer = new BufferedInputStream(fichero);
try { //captura de la exception de read
int dato = ficheroBuffer.read();
while (dato != -1) {
System.out.print((char) dato);
dato = ficheroBuffer.read();
}
} catch (IOException e) {
System.out.println("No se puede leer el fichero " + e.getMessage());
}
}
catch (FileNotFoundException e) {
System.out.println("El programa da un error porque no encuentra el fichero: " + e.getMessage());
}
}
}