ZIP4J压缩与解压缩

ZIP4j 压缩与解压的实例详解

使用的jar包:zip4j_2.6.4jar

1.导入maven依赖

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

基本功能:

针对ZIP压缩文件创建、添加、分卷、更新和移除文件
(读写有密码保护的Zip文件)
(支持AES 128/256算法加密)
(支持标准Zip算法加密)
(支持zip64格式)
(支持Store(仅打包,默认不压缩,不过可以手动设置大小)和Deflate压缩方法
(针对分块zip文件创建和抽出文件)
(支持编码)
(进度监控)

压缩方式(3种):

  1. static final int COMP_STORE = 0;(仅打包,不压缩) (对应好压的存储)
  2. static final int COMP_DEFLATE = 8;(默认) (对应好压的标准)
  3. static final int COMP_AES_ENC = 99;

压缩级别有5种:(默认0不压缩)级别跟好压软件是对应的;

  1. static final int DEFLATE_LEVEL_FASTEST = 1;
  2. static final int DEFLATE_LEVEL_FAST = 3;
  3. static final int DEFLATE_LEVEL_NORMAL = 5;
  4. static final int DEFLATE_LEVEL_MAXIMUM = 7;
  5. static final int DEFLATE_LEVEL_ULTRA = 9;

加密方式:

  1. static final int ENC_NO_ENCRYPTION = -1;(默认,没有加密方法,如果采用此字段,会报错”没有提供加密算法”)
  2. static final int ENC_METHOD_STANDARD = 0;
  3. static final int ENC_METHOD_AES = 99;

AES Key Strength:

  1. (默认-1,也就是ENC_NO_ENCRYPTION)
  2. static final int AES_STRENGTH_128 = 0x01;
  3. static final int AES_STRENGTH_192 = 0x02;
  4. static final int AES_STRENGTH_256 = 0x03;

从构造方法可以默认情况:

  1. compressionMethod = Zip4jConstants.COMP_DEFLATE;
  2. encryptFiles = false;//不设密码
  3. readHiddenFiles = true;//可见
  4. encryptionMethod = Zip4jConstants.ENC_NO_ENCRYPTION;//加密方式不加密
  5. aesKeyStrength = -1;//
  6. includeRootFolder = true;//
  7. timeZone = TimeZone.getDefault();/

在采取默认压缩时:

1.如果此压缩文件已经存在,那么压缩后,相同的文件会替换(有密码,密码被替换),原来不同的文件会继续保留,而且文件的时间还是第一次压缩的时间;如果想完全覆盖,那么需要判断此压缩文件存不存在,存在就删除;

2.假如a文件加密生成了a.zip,此时如果再把其他的文件b也加密,然后生成同样的a.zip,那么a.zip里面的文件a,b将会有各自的密码。需要分别输入对应密码解压,无形实现了对单个文件的单个加密,但是这样解压可能会损坏文件(个人不建议这样做)

3.如果不设置压缩级别,默认级别为0(不压缩),这样生成的zip包跟原来文件的大小差不多,另外如果压缩方式设置成了Zip4jConstants.COMP_STORE(0)那么也是仅仅打个包;

4.如果设置了中文密码,用好压解压会提示密码错误(无法解压),用ZIP4j解压的话,正常;也就说,对于中文密码,解压软件与zip4j是不能相互解压的,原因还不清楚,请大神说说;

压缩,解压缩的工具类

package com.example.demo;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

import java.io.*;

public class ZipUtil {

    /**
     * 不加密的压缩
     * @param inputFile D:\\test  要打包的文件夹
     * @param outputFile  D:\test.zip  生成的压缩包的名字
     */
    public static void zipFile(String inputFile,String outputFile)  {
        // 生成的压缩文件
        ZipFile zipFile = null;
        try {
            zipFile = new ZipFile(outputFile);
            ZipParameters parameters = new ZipParameters();
            // 压缩方式
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            // 压缩级别
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
            // 要打包的文件夹
            File currentFile = new File(inputFile);
            File[] fs = currentFile.listFiles();
            // 遍历test文件夹下所有的文件、文件夹
            for (File f : fs) {
                if (f.isDirectory()) {
                    zipFile.addFolder(f.getPath(), parameters);
                } else {
                    zipFile.addFile(f, parameters);
                }
            }
        } catch (ZipException e) {
            e.printStackTrace();
        }

    }


    /**
     * 压缩加密
     * @param inputFile  D:\\test  要打包的文件夹
     * @param outputFile  D:\test1.zip 生成的压缩包的名字
     */
    public static void ZipFileWithPwd(String inputFile,String outputFile) {
        // 生成的压缩文件
        ZipFile zipFile = null;
        try {
            zipFile = new ZipFile(outputFile);
            ZipParameters parameters = new ZipParameters();
            //设置压缩方式,默认是COMP_DEFLATE
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            //设置压缩级别,默认为0(即不压缩)
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
            //设置压缩密码(至少3步)
            //设置加密文件
            parameters.setEncryptFiles(true);
            //设置加密方式(必须要有加密算法) //设置AES加密方式
            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
            parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
            //设置压缩的密码
            parameters.setPassword("111");
            // 要打包的文件夹
            File currentFile = new File(inputFile);
            File[] fs = currentFile.listFiles();
            // 遍历test文件夹下所有的文件、文件夹
            for (File f : fs) {
                if (f.isDirectory()) {
                    zipFile.addFolder(f.getPath(), parameters);
                } else {
                    zipFile.addFile(f, parameters);
                }
            }
        } catch (ZipException e) {
            e.printStackTrace();
        }

    }

    /**
     * 解压缩
     * @param inputFile  D:\test1.zip  要解压缩的压缩包
     * @param outputFile D:\\test1  解压后的文件名
     */
    public static void unzip(String inputFile,String outputFile) {
        try {
            ZipFile zipFile = new ZipFile(inputFile);
            // 如果解压需要密码
            if(zipFile.isEncrypted()) {
                zipFile.setPassword("111");
            }
            zipFile.extractAll(outputFile);
        } catch (ZipException e) {
            e.printStackTrace();
        }
    }

    /**
     * zip文件下删除文件
     * @param inputFile  D:\test1.zip 要删除的压缩包
     * @param deleteFile  logger/error.2021-08-20.log  删除压缩包下路径的文件
     */
    public static void deleteFile(String inputFile,String deleteFile) {
        try {
            ZipFile zipFile = new ZipFile(inputFile);
            zipFile.removeFile(deleteFile);
        } catch (ZipException e) {
            e.printStackTrace();
        }
    }

    /**
     * 向zip文件下添加文件
     * @param inputFile    D:\test1.zip 要添加文件的压缩包
     * @param addFile logger/error.2021-08-20.log  要添加到压缩包下路径的文件路径  如果logger目录不存在,他会递归生成
     *
     * */
    public static void addFile(String inputFile,String addFile){
        InputStream is = null;
        try {
            ZipFile zip = new ZipFile(inputFile);
            ZipParameters para = new ZipParameters();
            para.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            para.setFileNameInZip(addFile);
            para.setSourceExternalStream(true);
            //可以根据自己的需求来改变字节输入流 需要一个添加文件的路径
            is = new ByteArrayInputStream(new String("这是文件内容").getBytes());
            //is = new FileInputStream(text);
            zip.addStream(is, para);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值