sirve read que para ejemplo java fileinputstream bufferedinputstream

java - read - bufferedinputstream para que sirve



Uso de BufferedInputStream (5)

Permítanme comenzar esta publicación con una sola advertencia. Soy un principiante total cuando se trata de Java. He estado programando PHP de forma intermitente por un tiempo, pero estaba listo para hacer una aplicación de escritorio, así que decidí usar Java por varias razones.

La aplicación en la que estoy trabajando está en las etapas iniciales (menos de 5 clases) y necesito leer bytes de un archivo local. Normalmente, los archivos tienen actualmente menos de 512kB (pero pueden aumentar de tamaño en el futuro). Actualmente, estoy usando un FileInputStream para leer el archivo en tres arrays de bytes, lo que satisface perfectamente mis requisitos. Sin embargo, he visto un BufferedInputStream mencionado, y me preguntaba si la forma en que estoy haciendo esto es la mejor, o si también debería usar un BufferedInputStream .

He investigado un poco y he leído algunas preguntas aquí en Stack Overflow, pero todavía tengo problemas para entender la mejor situación para cuándo usar y no usar BufferedInputStream . En mi situación, la primera matriz en la que leo bytes es solo unos pocos bytes (menos de 20). Si los datos que recibo son buenos en estos bytes, entonces leo el resto del archivo en dos matrices de bytes más de tamaño variable.

También he escuchado a muchas personas mencionar los perfiles para ver cuál es más eficiente en cada caso específico, sin embargo, no tengo experiencia en perfiles y no estoy muy seguro de por dónde empezar. Me encantaría algunas sugerencias sobre esto también.

Lo siento por un post tan largo, pero realmente quiero aprender y entender la mejor manera de hacer estas cosas. Siempre tengo el mal hábito de adivinar mis decisiones, así que me encantaría recibir comentarios. ¡Gracias!


BufferedInputStream lee más del archivo que necesita por adelantado. Según tengo entendido, está haciendo más trabajo de antemano, como, 1 gran lectura de disco continua frente a muchas de ellas en un circuito cerrado.

En cuanto a los perfiles, me gusta el generador de perfiles integrado en netbeans. Es muy fácil empezar. :-)


No puedo hablar sobre el perfil, pero por mi experiencia en el desarrollo de aplicaciones Java, encuentro que al usar cualquiera de las clases de búfer (BufferedInputStream, StringBuffer) mis aplicaciones son excepcionalmente más rápidas. Debido a lo cual, los uso incluso para los archivos más pequeños o la operación de cadena.


Si está utilizando una matriz relativamente grande para leer los datos un trozo a la vez, entonces BufferedInputStream solo introducirá una copia inútil. (Recuerde, read no necesariamente lee toda la matriz, es posible que desee DataInputStream.readFully ). Donde BufferedInputStream gana es cuando hace muchas lecturas pequeñas.


Si siempre realiza lecturas pequeñas, entonces BufferedInputStream le proporcionará un rendimiento significativamente mejor. Cada solicitud de lectura en un flujo no almacenado normalmente da como resultado una llamada del sistema al sistema operativo para leer el número de bytes solicitado. La sobrecarga de hacer una llamada al sistema puede ser miles de instrucciones de la máquina por syscall. Un flujo almacenado en búfer reduce esto haciendo una lectura grande para (digamos) hasta 8k bytes en un búfer interno, y luego distribuyendo bytes desde ese búfer. Esto puede reducir drásticamente el número de llamadas al sistema.

Sin embargo, si está realizando lecturas grandes (por ejemplo, 8k o más), BufferedInputStream ralentiza las cosas. Por lo general, no reduce el número de llamadas al sistema y el almacenamiento en búfer introduce un paso de copia de datos adicional.

En su caso de uso (donde lee un fragmento de 20 bytes primero y luego muchos fragmentos grandes), diría que usar un BufferedInputStream es más probable que reduzca el rendimiento que aumente. Pero en última instancia, depende de los patrones de lectura reales.


import java.io.*; class BufferedInputStream { public static void main(String arg[])throws IOException { FileInputStream fin=new FileInputStream("abc.txt"); BufferedInputStream bis=new BufferedInputStream(fin); int size=bis.available(); while(true) { int x=bis.read(fin); if(x==-1) { bis.mark(size); System.out.println((char)x); } } bis.reset(); while(true) { int x=bis.read(); if(x==-1) { break; System.out.println((char)x); } } } }