Tengo algunas preguntas generales con respecto a la biblioteca java.util.zip
. Lo que básicamente hacemos es importar y exportar muchos componentes pequeños. Anteriormente estos componentes fueron importados y exportados utilizando un único archivo grande, por ejemplo .:java.util.zip - ZipInputStream v.s. ZipFile
<component-type-a id="1"/>
<component-type-a id="2"/>
<component-type-a id="N"/>
<component-type-b id="1"/>
<component-type-b id="2"/>
<component-type-b id="N"/>
Tenga en cuenta que el orden de los componentes durante la importación es relevante.
Ahora cada componente debe ocupar su propio archivo que debe ser externamente versionado, QA-ed, bla, bla. Decidimos que el resultado de nuestra exportación debería ser un archivo zip (con todos estos archivos) y la entrada de nuestra importación debería ser un archivo zip similar. No queremos explotar el zip en nuestro sistema. No queremos abrir flujos separados para cada uno de los archivos pequeños. Mis preguntas actuales:
Q1. ¿Puede el ZipInputStream
garantizar que las entradas zip (los pequeños archivos) se leerán en el mismo orden en que fueron insertadas por nuestra exportación que usa ZipOutputStream
? Asumo la lectura es algo así como:
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null)
{
//read from zis until available
}
Sé que el directorio central de cremallera se puso al final del archivo zip, pero sin embargo las entradas del archivo de Inside orden secuencial. También sé que confiar en la orden es una idea desagradable, pero solo quiero tener todos los hechos en mente.
Q2. Si utilizo ZipFile
(que prefiero) ¿cuál es el impacto en el rendimiento de llamar al getInputStream()
cientos de veces? ¿Será mucho más lento que la solución ZipInputStream
? El zip se abre solo una vez y ZipFile
está respaldado por RandomAccessFile
- ¿es correcto? Asumo la lectura es algo así como:
ZipFile zipfile = new ZipFile(argv[0]);
Enumeration e = zipfile.entries();//TODO: assure the order of the entries
while(e.hasMoreElements()) {
entry = (ZipEntry) e.nextElement();
is = zipfile.getInputStream(entry));
}
Q3. ¿Se recuperan las secuencias de entrada del mismo subproceso ZipFile
? (Por ejemplo, ¿puedo leer diferentes entradas en diferentes subprocesos simultáneamente)? ¿Alguna penalización de rendimiento?
Gracias por sus respuestas!
Hola StaxMan! Estaba comprobando la implementación de ZipFile $ ZipFileInputStream en JDK6. Esto es devuelto por ZipFile.getInputStream Aunque tiene sincronización, realmente no sé qué tan confiable es eso. –
Sí, no puedo decir con seguridad que no sea seguro para subprocesos. Una parte más peligrosa es la biblioteca zlib nativa subyacente, que sospecho que no es segura para subprocesos. – StaxMan
Puedo testificar el hecho de que no es peligroso para los hilos, a través de una experiencia dolorosa. – Joel