¿Cuál es la forma más rápida de extraer 1 archivo de un archivo zip que contiene muchos archivos?

Probé el paquete java.util.zip , es muy lento.

Luego encontré LZMA SDK y 7z jbinding pero también faltan algo. El LZMA SDK no proporciona un tipo de documentación / tutorial de cómo usarlo, es muy frustrante. No javadoc.

Si bien 7b jbinding no proporciona una forma sencilla de extraer solo 1 archivo, sin embargo, solo proporciona una forma de extraer todo el contenido del archivo zip. Además, no proporciona una manera de especificar una ubicación para colocar el archivo descomprimido.

¿Alguna idea por favor?

¿Qué aspecto tiene su código con java.util.zip y qué tamaño de archivo zip está tratando?

Soy capaz de extraer una entrada de 4MB de un archivo zip de 200MB con 1,800 entradas en aproximadamente un segundo con esto:

 OutputStream out = new FileOutputStream("your.file"); FileInputStream fin = new FileInputStream("your.zip"); BufferedInputStream bin = new BufferedInputStream(fin); ZipInputStream zin = new ZipInputStream(bin); ZipEntry ze = null; while ((ze = zin.getNextEntry()) != null) { if (ze.getName().equals("your.file")) { byte[] buffer = new byte[8192]; int len; while ((len = zin.read(buffer)) != -1) { out.write(buffer, 0, len); } out.close(); break; } } 

No he evaluado la velocidad, pero con java 7 o superior, extraigo un archivo de la siguiente manera.
Me imagino que es más rápido que la API de ZipFile :

Un breve ejemplo que extrae META-INF/MANIFEST.MF de un archivo zip test.zip :

 // file to extract from zip file String file = "MANIFEST.MF"; // location to extract the file to File outputLocation = new File("D:/temp/", file); // path to the zip file Path zipFile = Paths.get("D:/temp/test.zip"); // load zip file as filesystem try (FileSystem fileSystem = FileSystems.newFileSystem(zipFile, null)) { // copy file from zip file to output location Path source = fileSystem.getPath("META-INF/" + file); Files.copy(source, outputLocation.toPath()); } 

Utilice un archivo Zip en lugar de un ZipInputStream .

Aunque la documentación no indica esto (está en la documentación de JarFile ), debe usar operaciones de archivos de acceso aleatorio para leer el archivo. Dado que un archivo ZIP contiene un directorio en una ubicación conocida, esto significa que MUCHO menos IO tiene que suceder para encontrar un archivo en particular.

Algunas advertencias: a mi entender, la implementación de Sun utiliza un archivo asignado en memoria. Esto significa que su espacio de direcciones virtuales debe ser lo suficientemente grande como para contener el archivo, así como todo lo demás en su JVM. Lo que puede ser un problema para un servidor de 32 bits. Por otro lado, puede ser lo suficientemente inteligente como para evitar el mapeo de memoria en 32 bits, o el mapa de memoria solo del directorio; No lo he intentado

Además, si está utilizando varios archivos, asegúrese de usar try / finally para asegurarse de que el archivo se cierre después de usarlo.

    Intereting Posts