Zip压缩和解压并解决资源占用问题

本文介绍了一种简洁的解压缩接口zip4j,它能够有效地解决在压缩和解压过程中因inputStream和outputStream流未释放而导致的文件资源被占用问题。通过使用zip4j,不仅可以实现文件的压缩和解压,还能在解压缩zip包的基础上,干净地释放占用资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们常用的文件上传下载,或者多个脚本服务器本地压缩生成的过程中,经常会用到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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值