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

  1. 它们臃肿不堪,API设计糟糕.我必须write 50 lines of boiler plate byte array output, zip input, file out streams and close relevant streams and catch exceptions and move byte buffers on my own?为什么我不能有一个简单的API,它看起来像Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null)Zipper.zip(File targetDirectory, String password = null),可以正常工作?

  2. 压缩-解压似乎会 destruct 文件元数据,密码处理也会中断.

  3. 而且,与我在UNIX上使用的命令行zip工具相比,我try 的所有库的速度都慢了2-3倍?

对我来说(2)和(3)是次要的,但我真的希望有一个良好的测试库和一行接口.

推荐答案

我知道已经很晚了,答案也很多,但是这个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>

Java相关问答推荐

方法没有用正确的值填充数组—而是将数组保留为null,'

为什么我们不能实现两个接口,其中一个接口有相同的签名,其中一个接口有默认的实现在java?'

springboot start loge change

如何使用AWS CLI从S3存储桶中的所有对象中删除用户定义的元数据?

确定Java中Math.Ranb()输出的上限

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

无法在WebSocket onMessage中捕获错误

RichFaces 3.x-Spring Boot-迁移web.xml

如何在EL处理器中定义带有命名空间的变量?

寻找Thread.sky()方法的清晰度

组合连接以从两个表返回数据

在java中使用不同的application.properties-jar而不使用Spring

如何在SWT菜单项文本中保留@字符

我的代码是线程安全的吗?[Java、CAS、转账]

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

Java返回生成器的实现

AspectJ编织外部依赖代码,重新打包jar并强制依赖用户使用它

在数组中查找素数时出现逻辑错误

获取月份';s在java中非UTC时区的开始时间和结束时间

如何在更改分辨率时将鼠标坐标计算为世界坐标