Pregunta

1) ¿De qué manera los flujos de trabajo búfer en el fondo, en qué se diferencian de las corrientes normales y cuáles son las ventajas (s) de usarlos?

2) DataInputStream es también Byte en base. Pero está teniendo métodos para readLine(). ¿Qué es el punto aquí?

¿Fue útil?

Solución

Desde el javadoc BufferedInputStream:

  

A BufferedInputStream añade funcionalidad a otra entrada corriente, a saber, la capacidad de amortiguar la entrada y para apoyar la marca y restablecer métodos. Cuando se crea el BufferedInputStream, se crea una matriz intermedia interna. Como bytes de la corriente se leen o omiten, la memoria intermedia interna se vuelve a llenar como sea necesario de la corriente de entrada contenida, muchos bytes a la vez. La operación marca se acuerda un punto en el flujo de entrada y la operación de reposición hace que todos los bytes leídos desde la última operación de la marca que se vuelven a leer antes de que nuevas bytes se toman de la corriente de entrada contenida.

Internamente una matriz de tampón se utiliza y en lugar de leer bytes individualmente de entre el flujo de entrada subyacente suficientes bytes se leen para llenar la memoria intermedia. En general, esto se traduce en un rendimiento más rápido como menos se requieren lecturas del flujo de entrada subyacente.

Lo contrario es cierto para luego BufferedOutputStream.

marca () y reset () podría ser utilizado como sigue:

1 BufferedInputStream bis = new BufferedInputStream(is);
2 byte[] b = new byte[4];
3 bis.read(b); // read 4 bytes into b
4 bis.mark(10); // mark the stream at the current position - we can read 10 bytes before the mark point becomes invalid
5 bis.read(b); // read another 4 bytes into b
6 bis.reset(); // resets the position in the stream back to when mark was called
7 bis.read(b); // re-read the same 4 bytes as line 5 into b

Para explicar marca / restaurar algunas más ...

El BufferInputStream recuerda internamente la posición actual en la memoria intermedia. A medida que lea la posición bytes se incrementará. Una llamada a marcar (10) para guardar la posición actual. Las llamadas posteriores a leer continuará para incrementar la posición actual, sino una llamada a restablecer fijarán la posición actual de nuevo a su valor cuando la marca fue llamado.

El argumento para marcar especifica cuántos bytes se puede leer después de llamar a la marca antes de la posición de la marca se invalida. Una vez que se invalida la posición de la marca ya no se puede llamar de reinicio para volver a ella.

Por ejemplo, si la marca (2) se había utilizado en la línea 4 por encima de una IOException sería arrojado cuando reset () se llama en la línea 6 como la posición de la marca habría sido invalidada desde leemos más de 2 bytes.

Otros consejos

Los lectores de búfer / escritores / InputStreams / OutputStreams leer y escribir en el sistema operativo en trozos grandes para la optimización. En caso de escritores y OutputStreams, los datos se almacena temporalmente en la memoria hasta que haya suficiente recogido para escribir una gran parte. En el caso de los lectores y InputStreams, una gran parte se lee forma de disco / red / ... en la memoria intermedia y todas las lecturas se realizan a partir de ese tampón hasta que la memoria intermedia está vacía, y un nuevo trozo se lee en.

DataInputStream se basa de hecho bytes. El método readLine está en desuso. Internamente se lee bytes desde el disco / red / ... byte por byte hasta que se haya recogido una línea completa. Por lo que este flujo puede ser acelerado mediante el uso de un BufferedInputStream ya que es la fuente, de modo que los bytes para la línea se leen de la memoria intermedia en la memoria en lugar de directamente desde el disco.

Con sin buffer de E / S que cada solicitud de lectura o escritura se pasa directamente al sistema operativo. tamponadas flujos de E / S de Java leer y escribir datos a su propia memoria intermedia (por lo general una matriz de bytes). Las llamadas al sistema operativo sólo se hacen cuando la memoria intermedia está vacía (cuando se hace lee) o el buffer está lleno (al hacer escrituras). A veces es una buena idea para vaciar el búfer de forma manual después de los puntos críticos en su aplicación.

Dado que las llamadas a la API del sistema operativo pueden resultar en el acceso al disco, actividad de la red y similares, esto puede ser bastante caro. El uso de tampones a lote el sistema operativo nativo I / O en trozos más grandes a menudo mejora significativamente el rendimiento.

corrientes de búfer escribir o leer datos en fragmentos más grandes por - nomen est omen - búfer . Dependiendo de la secuencia subyacente, esto puede aumentar drásticamente el rendimiento.

java.io.BufferedOutputStream 's Javadocs:

  

Con la creación de un flujo de salida de tales,   una aplicación puede escribir bytes al   flujo de salida subyacente sin   provocando necesariamente una llamada a la   sistema subyacente para cada byte   por escrito.

Para reducir este tipo de gastos generales, la plataforma Java que implementa memoria intermedia de E / S arroyos. entrada Buffered flujos de datos de lectura desde una zona de memoria conocido como un tampón; la API de entrada nativa se llama sólo cuando la memoria intermedia está vacía. Del mismo modo, las corrientes de salida con buffer escribir datos en un buffer, y la API nativa de salida se llama sólo cuando el búfer está lleno.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top