compression - ¿Qué es una buena biblioteca de Java para comprimir / descomprimir archivos?




4 Answers

Con IOUtils Apache Commons-IO puedes hacer esto:

java.util.zip.ZipFile zipFile = new ZipFile(file);
try {
  Enumeration<? extends ZipEntry> entries = zipFile.entries();
  while (entries.hasMoreElements()) {
    ZipEntry entry = entries.nextElement();
    File entryDestination = new File(outputDir,  entry.getName());
    if (entry.isDirectory()) {
        entryDestination.mkdirs();
    } else {
        entryDestination.getParentFile().mkdirs();
        InputStream in = zipFile.getInputStream(entry);
        OutputStream out = new FileOutputStream(entryDestination);
        IOUtils.copy(in, out);
        IOUtils.closeQuietly(in);
        out.close();
    }
  }
} finally {
  zipFile.close();
}

Todavía es un código repetitivo, pero solo tiene una dependencia no exótica: Commons-IO

compression zip unzip java

Miré la biblioteca Zip predeterminada que viene con el JDK y las bibliotecas de compresión de Apache y no estoy contento con ellos por 3 razones:

  1. Están hinchados y tienen mal diseño API. ¿Tengo que escribir 50 líneas de salida de matriz de bytes de la placa de caldera, entrada zip, archivar flujos y cerrar flujos relevantes y capturar excepciones y mover buffers de bytes por mi cuenta ? ¿Por qué no puedo tener una API simple como esta Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null) y Zipper.zip(File targetDirectory, String password = null) que simplemente funciona?

  2. Parece que el proceso de descompresión de archivos comprimidos destruye los metadatos de archivos y el manejo de contraseñas no funciona.

  3. Además, todas las bibliotecas que probé eran 2-3x lentas en comparación con las herramientas zip de la línea de comandos que obtengo con UNIX.

Para mí (2) y (3) son puntos menores, pero realmente quiero una biblioteca bien probada con una interfaz de una línea.




Otra opción que puede consultar es zt-zip disponible desde la página central y del proyecto de Maven en https://github.com/zeroturnaround/zt-zip

Tiene la funcionalidad de empaquetado y desempaque estándar (en secuencias y en el sistema de archivos) + muchos métodos de ayuda para probar los archivos en un archivo o agregar / eliminar entradas.




Un proyecto muy bonito es TrueZip .

TrueZIP es un marco de plug-in basado en Java para sistemas de archivos virtuales (VFS) que proporciona acceso transparente a archivos comprimidos como si fueran directorios simples

Por ejemplo (desde el website ):

File file = new TFile("archive.tar.gz/README.TXT");
OutputStream out = new TFileOutputStream(file);
try {
   // Write archive entry contents here.
   ...
} finally {
   out.close();
}






Related