read convertir java stream inputstream outputstream

convertir - Java: FilterInputStream cuáles son las ventajas y el uso en comparación con otras secuencias



read outputstream java (3)

He estado leyendo sobre InputStream , FileInputStream , ByteArrayInputStream y cómo su uso parece bastante claro (las secuencias de salida también).

Lo que estoy luchando es entender el uso de FilterInputStream y FilterOutputStream :

  • ¿Cuál es la ventaja de usarlo en comparación con las otras clases de transmisión?
  • ¿Cuándo debo usarlo?
  • Por favor proporcione una explicación teórica y un ejemplo básico.

Los usas cuando quieres decorar el flujo de datos.

Recuerde que estas instancias de clase de flujo se envuelven alrededor de otra instancia de flujo (ya sea otra subclase de uno de estos o no) y agreguen alguna característica, agreguen algo de procesamiento, realicen algunos cambios en los datos a medida que pasan.

Por ejemplo, es posible que desee eliminar todos los espacios múltiples de algún flujo. Crea tu propia subclase de FilterInputStream y anula el método read() . No voy a molestar todos los detalles, pero aquí hay algunos sorta-java para el método en la subclase:

private boolean lastWasBlank = false; public int read() { int chr = super.read(); if (chr == '' '') { if (lastWasBlank) { return read(); } else { lastWasBlank = true; } } else { lastWasBlank = false; } return chr; }

En la vida real, es probable que también te metas con los otros dos métodos de read() .

Otros usos:

  • Registrar todo lo que fluye a través de la corriente
  • Duplique la utilidad ''tee'' para que la secuencia que se está leyendo se maneje de dos maneras.
  • Convierte los finales de línea entre Windows, Mac y Unix / Linux.
  • Agregue demoras para simular métodos de transmisión lenta como módems o puertos serie o conexiones de red inalámbrica.

FilterInputStream es un ejemplo del patrón Decorator.

Esta clase debe ser extendida, ya que su constructor está protected . La clase derivada agregaría capacidades adicionales, pero aún así expondría la interfaz básica de un InputStream .

Por ejemplo, un BufferedInputStream proporciona un almacenamiento en búfer de un flujo de entrada subyacente para que la lectura de los datos sea más rápida, y un DigestInputStream calcula un hash criptográfico de los datos a medida que se consumen.

Lo usaría para agregar funcionalidad al código existente que depende de la API InputStream o OutputStream . Por ejemplo, supongamos que utiliza alguna biblioteca que guarda los datos en un OutputStream . Los datos están creciendo demasiado, por lo que desea agregar compresión. En lugar de modificar la biblioteca de persistencia de datos, puede modificar su aplicación para que "decore" la secuencia que actualmente crea con un ZipOutputStream . La biblioteca utilizará el flujo tal como usó la versión anterior que carecía de compresión.


FilterOutputStream y FilterOutputStream están ahí para facilitar el trabajo de los desarrolladores que deseen implementar sus propios flujos de entrada / salida. Las implementaciones como BufferedInputStream pueden agregar sus propias decoraciones en torno a la API básica de InputStream tiempo que delegan en la super clase, FilteredInputStream en este caso, los métodos que no necesitan anular.

Ni FilterOutputStream ni FilterOutputStream están diseñados para que los usuarios finales los utilicen directamente.