¿Cuándo usar deflate () de deflateroutputstream?

Dec 23 2020

Estoy tratando de aprender a usar deflateroutputstream como algo para matar el tiempo durante mis vacaciones de invierno. Estoy confundido porque cuando miro la documentación,https://docs.oracle.com/javase/7/docs/api/java/util/zip/DeflaterOutputStream.html, dice que deflate () se usa para escribir datos comprimidos en el flujo de salida, mientras que write () es para escribir datos en el flujo de salida deflater (flujo de salida comprimido) para ser comprimidos.

Sin embargo, estoy viendo códigos de muestra en Internet, pero nadie usa deflate () en absoluto. Todo el código que he visto hasta ahora solo escribe () en deflateroutputstream sin llamar a deflate ().https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.DeflaterOutputStream

Noté que el código coloca un fileoutputstream dentro del deflateroutputstream, pero ¿cómo interactúa? ¿Llama automáticamente a deflate () para enviar datos comprimidos a fileoutputstream cuando los datos se escriben en deflateroutputstream?

Respuestas

3 rzwitserloot Dec 23 2020 at 21:21

Es protected: está destinado a cualquier subclasificación de ese flujo, y no lo está subclasificando, por lo que, en lo que a usted respecta, es un detalle de implementación que no puede incluir en su razonamiento y que no debe invocar.

A menos que, por supuesto, lo subclases.

Lo que podría, es una especie de juego de herramientas para construir flujos de compresión basados ​​en LZ encima. Es por eso que tanto GZipOutputStream como ZipOutputStream lo amplían: son contenedores diferentes que usan más o menos la misma tecnología de compresión. Y ellos hacen invocar dicho deflate. A menos que esté desarrollando su propio sistema de compresión basado en LZ o implementando un lector para un formato de compresión existente, sin zip, sin gz, sin deflater, esto no es para usted.

Estos tipos de flujos de salida se denominan "flujos de filtros": no representan en sí mismos ningún recurso, sino que envuelven uno. Pueden envolver cualquiera OutputStream(o cualquiera InputStream, el concepto funciona en 'ambos lados' por así decirlo) y modificar bytes en tránsito.

var out = new DeflaterOutputStream(whatever)crea una nueva secuencia deflater que comprimirá cualquier dato que le envíe (vía out.write(stuff)), y a su vez tomará los datos comprimidos y los enviará a lo que sea. Hace el trabajo de:

  1. tomar bytes (según out.write), almacenar en búfer tanto como sea necesario para hacer el trabajo:
  2. ... de comprimir estos datos.
  3. Luego procese los datos comprimidos, a medida que se comprimen, enviándolos al flujo de salida empaquetado ( whateveren este ejemplo), llamando a su writemétodo.

El uso básico es:

  1. Cree un recurso, como Files.newOutputStreamo someSocket.getOutputStreamo httpServletResponse.getOutputStream()o System.outcualquier otra cosa que produzca un flujo; es un concepto abstracto por una razón: para hacer las cosas flexibles.
  2. Envuelva ese recurso en un DeflaterOutputStream
  3. Escriba todos sus datos en deflateroutputstream. Olvídese del original: lo hizo para poder pasarlo a DeflaterOutputStream, y ahí es donde termina su interacción con la transmisión subyacente.
  4. Cierre la corriente deflaterstream (que terminará cerrando también la corriente subyacente).