在我们常用的文件上传下载,或者多个脚本服务器本地压缩生成的过程中,经常会用到zip压缩和解压方法
平常我们用的zip工具类一般都是java.util.zip包内的解压缩代码,这个构建内的代码虽然也能解决我们的压缩和解压方法,但是如果我们希望删除刚刚生成的zip包,或者某个zip包被java.util.zip内的解压方法解压一遍之后,如果我们的系统进程还在运行的话,就会出现无法删除压缩包,压缩包被Java(TM) resouce占用的情况
经过在网上的搜索,给出的原因基本上都是zip包在压缩和解压过程中,inputStream和outputStream流未释放干净,从而导致文件资源被占用无法删除
不少网站上虽然贴出来不少释放资源的解决方案,但是基本上代码都比较复杂,而且只解决了压缩的资源释放故障,未解决解压的资源释放问题
经过我在stackoverflow上搜索过的答案,给大家提出一个新的比较干净简洁的解决思路,而且能够在解压缩zip包的基础之上,干净的释放占用资源
请容我介绍简洁解压缩接口依赖zip4j
依赖配置为
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
代码如下,非常的简洁和方便,大家可以尝试使用:
import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.util.Zip4jConstants;
public static void zip(String targetPath, String destinationFilePath, String password) { try { ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); if(password.length()>0){ parameters.setEncryptFiles(true); parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); parameters.setPassword(password); } ZipFile zipFile = new ZipFile(destinationFilePath); File targetFile = new File(targetPath); if(targetFile.isFile()){ zipFile.addFile(targetFile, parameters); }else if(targetFile.isDirectory()){ zipFile.addFolder(targetFile, parameters); } } catch (Exception e) { e.printStackTrace(); } } public static void unzip(String targetZipFilePath, String destinationFolderPath, String password) { try { ZipFile zipFile = new ZipFile(targetZipFilePath); if (zipFile.isEncrypted()) { zipFile.setPassword(password); } zipFile.extractAll(destinationFolderPath); } catch (Exception e) { e.printStackTrace(); } }