Java加密压缩Zip

JDK自带的ZIP操作接口(java.util.zip包)不直接支持加密压缩,项目中需要用到加密压缩,在网上查了查,已经有人封装好了。Zip4j功能比较强大,支持加密、解密压缩,支持文件的添加、删除等。

使用Zip4j进行加密压缩

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

byte[] buffer = writer.toString().getBytes(StandardCharsets.US_ASCII);

ZipParameters zipParameters = new ZipParameters();
// 使用密码
zipParameters.setEncryptFiles(true);
// 加密方式
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);
// zip中的文件名
zipParameters.setFileNameInZip(String.format("%s.txt", packageName));

File tempFile = File.createTempFile(packageName, ".zip");
// 先删除,fileZip会自动创建
tempFile.delete();
log.info("file_path:{}", tempFile.getAbsolutePath());

new ZipFile(tempFile, this.password.toCharArray()).addStream(new ByteArrayInputStream(buffer), zipParameters);

我生成压缩文件是为了上传使用,所以使用了File.createTempFile创建了一个临时文件,实际使用时发现生成压缩包时zip4j会判断我们传入的file是否为一个zip文件,我们这个文件是临时创建的是一个长度为0的空文件,所以直接报错了。

if (zip4jRaf.length() < ENDHDR) {
    throw new ZipException("Zip file size less than minimum expected zip file size. " +
        "Probably not a zip file or a corrupted zip file");
}

我再File.createTempFile后又将这个文件删除了,把生成文件的任务交给zip4j去处理,这样就没有问题了。

参考文档

Zip4j - A Java library for zip files / streams


Java加密压缩Zip
https://blog.yjll.blog/post/45e649c7.html
作者
简斋
发布于
2020年10月26日
许可协议