什么是压缩/解压缩文件的好Java库?[已关闭]

2022-08-31 05:23:03

我查看了JDK和Apache压缩库附带的默认Zip库,我对它们不满意,原因有3个:

  1. 它们臃肿并且API设计不佳。我必须编写50行样板字节数组输出,zip输入,文件输出流并关闭相关流并捕获异常并自行移动字节缓冲区?为什么我不能有一个简单的API,看起来像这样,而且只是工作?Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null)Zipper.zip(File targetDirectory, String password = null)

  2. 似乎拉链解压缩会破坏文件元数据,密码处理被破坏。

  3. 另外,我尝试的所有库都比我用UNIX获得的命令行zip工具慢2-3倍?

对我来说(2)和(3)是次要的,但我真的想要一个带有单行界面的良好测试库。


答案 1

我知道它很晚了,有很多答案,但这个zip4j是我用过的最好的压缩库之一。它简单(无锅炉代码),可以轻松处理受密码保护的文件。

import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.core.ZipFile;


public static void unzip(){
    String source = "some/compressed/file.zip";
    String destination = "some/destination/folder";
    String password = "password";

    try {
         ZipFile zipFile = new ZipFile(source);
         if (zipFile.isEncrypted()) {
            zipFile.setPassword(password);
         }
         zipFile.extractAll(destination);
    } catch (ZipException e) {
        e.printStackTrace();
    }
}

Maven 依赖关系是:

<dependency>
    <groupId>net.lingala.zip4j</groupId>
    <artifactId>zip4j</artifactId>
    <version>1.3.2</version>
</dependency>

答案 2

在Java 8中,使用Apache Commons-IOIOUtils,您可以执行以下操作:

try (java.util.zip.ZipFile zipFile = new ZipFile(file)) {
  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();
        try (InputStream in = zipFile.getInputStream(entry);
             OutputStream out = new FileOutputStream(entryDestination)) {
            IOUtils.copy(in, out);
        }
    }
  }
}

它仍然是一些样板代码,但它只有1个非奇异的依赖项:Commons-IO

在Java 11及更高版本中,可能有更好的选择,请参阅ZhekaKozlov的评论。


推荐