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



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();
}

Sigue siendo un código repetitivo, pero solo tiene una dependencia no exótica: Commons-IO

Question

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

  1. Están hinchados y tienen un diseño API malo. Tengo que escribir 50 líneas de salida de matriz de byte de placa de caldera, entrada de zip, flujo de salida de archivos y cerrar transmisiones relevantes y capturar excepciones y mover búferes de byte por mi cuenta . ¿Por qué no puedo tener una API simple que se parece a Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null) y Zipper.zip(File targetDirectory, String password = null) que simplemente funciona?

  2. Parece que descomprimir la descompresión destruye los metadatos del archivo y el manejo de contraseñas está dañado.

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

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




Un proyecto muy lindo es TrueZip .

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

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();
}






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

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




Related