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
去处理,这样就没有问题了。
参考文档
Java加密压缩Zip
https://blog.yjll.blog/post/45e649c7.html