initialize create crear java io outputstream

create - Forma preferida de usar Java ZipOutputStream y BufferedOutputStream



java outputstream to string (2)

Debieras:

ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));

porque desea almacenar la escritura en el disco (porque es mucho más eficiente en bloques de datos grandes que en muchos pequeños).

Esta

new BufferedOutputStream(new ZipOutputStream(dest));

almacenaría el buffer antes de la compresión zip. Pero todo esto sucede en la memoria y no necesita almacenamiento en búfer porque una gran cantidad de pequeños accesos a la memoria tienen más o menos la misma velocidad que unos pocos grandes. En general, la memoria el tiempo necesario es proporcional al número de bytes de lectura / escritura.

Como se menciona en los comentarios:

Los métodos de ZipOutputStream que no son parte de BufferedOutputStream no estarían disponibles también. Por ejemplo, putNextEntry y closeEntry .

En Java, ¿importa si primero instauro un ZipOutputStream o el BufferedOutputStream primero? Ejemplo:

FileOutputStream dest = new FileOutputStream(file); ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream(dest)); // use zip output stream to write to

O:

FileOutputStream dest = new FileOutputStream(file); BufferedOutputStream out = new BufferedOutputStream(new ZipOutputStream(dest)); // use buffered stream to write to

En mis tiempos no científicos, parece que aquí no veo mucha diferencia. No puedo ver nada en la API de Java que indique si una de estas formas es necesaria o preferida. ¿Algún consejo? Parece que comprimir la salida primero y luego almacenarla en búfer para escribir sería más eficiente.


Siempre debe envolver BufferedOutputStream con ZipOutputStream , nunca al revés. Vea el siguiente código:

FileOutputStream fos = new FileOutputStream("hello-world.zip"); BufferedOutputStream bos = new BufferedOutputStream(fos); ZipOutputStream zos = new ZipOutputStream(bos); try { for (int i = 0; i < 10; i++) { // not available on BufferedOutputStream zos.putNextEntry(new ZipEntry("hello-world." + i + ".txt")); zos.write("Hello World!".getBytes()); // not available on BufferedOutputStream zos.closeEntry(); } } finally { zos.close(); }

Como dicen los comentarios, los putNextEntry() y closeEntry() no están disponibles en BufferedOutputStream . Sin llamar a esos métodos, ZipOutputStream arroja una excepción java.util.zip.ZipException: no current ZIP entry .

En aras de la exhaustividad, vale la pena señalar que la cláusula finally solo llama a close() en ZipOutputStream . Esto se debe a que, por convención, todas las implementaciones de wrapper de flujo de salida de Java incorporadas propagan el cierre.

EDITAR

Acabo de probarlo al revés. Resulta que envolver un ZipOutputStream con BufferedOutputStream y luego solo llamar a write() en él (sin crear / cerrar entradas) no lanzará una ZipException . En cambio, el archivo ZIP resultante estará dañado, sin ninguna entrada dentro de él.