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
    评论
### 回答1: zip4jJava语言的一个开源库,它提供了创建和解压ZIP文件的功能,并支持分卷压缩。下面是一个使用zip4j实现分卷压缩的代码示例: ```java import net.lingala.zip4j.ZipFile; import net.lingala.zip4j.exception.ZipException; public class ZipExample { public static void main(String[] args) throws ZipException { // 要压缩的文件或文件夹路径 String sourceFilePath = "C:\\path\\to\\source\\file\\or\\folder"; // 压缩后的文件路径 String destinationFilePath = "C:\\path\\to\\destination\\file.zip"; // 压缩文件时每个卷的大小(单位为字节) int splitSize = 1024 * 1024; // 每个卷为1MB // 创建ZipFile对象 ZipFile zipFile = new ZipFile(destinationFilePath); // 设置分卷压缩的大小 zipFile.setSplitLength(splitSize); // 添加要压缩的文件或文件夹 zipFile.addFolder(new File(sourceFilePath)); // 执行压缩操作 zipFile.createZipFile(); } } ``` 在上面的示例中,我们首先指定要压缩的文件或文件夹的路径,以及压缩后的文件路径。然后,我们创建了一个`ZipFile`对象并设置了每个卷的大小。接下来,我们将要压缩的文件或文件夹添加到`ZipFile`对象中,最后调用`createZipFile`方法执行压缩操作。 注意,当使用分卷压缩时,压缩后的文件名会自动添加后缀“.z01”、“.z02”等,表示第一个、第二个卷等。在解压缩时,您需要提供所有卷的文件路径,zip4j将自动将它们组合成一个完整的ZIP文件进行解压缩。 ### 回答2: zip4j是一个用于处理zip文件的Java库,可以实现分卷压缩。下面是一个使用zip4j库实现分卷压缩的代码示例。 首先,需要导入zip4j库,可以从官方网站https://github.com/srikanth-lingala/zip4j下载最新版本的zip4j.jar文件,并将其添加到项目的classpath中。 然后,可以使用以下代码实现分卷压缩: ```java import net.lingala.zip4j.ZipFile; import net.lingala.zip4j.model.ZipParameters; public class ZipWithVolumesExample { public static void main(String[] args) { try { // 创建一个ZipFile对象,指定压缩文件名和密码 ZipFile zipFile = new ZipFile("archive.zip"); zipFile.setPassword("password"); // 创建ZipParameters对象,设置压缩参数 ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // 设置压缩方法 parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 设置压缩级别 // 设置分卷压缩的大小(以字节为单位),这里设置为1MB parameters.setSplitLength(1024 * 1024); // 添加需要压缩的文件到zip文件中 zipFile.addFile(new File("file1.txt"), parameters); zipFile.addFile(new File("file2.txt"), parameters); zipFile.addFile(new File("file3.txt"), parameters); // 完成压缩操作 zipFile.createZipFile(); System.out.println("分卷压缩完成!"); } catch (ZipException e) { e.printStackTrace(); } } } ``` 上述代码首先创建了一个ZipFile对象,然后创建了一个ZipParameters对象,并设置了压缩参数,其中包括设置分卷压缩的大小。然后通过`addFile`方法向zip文件中添加需要压缩的文件,最后调用`createZipFile`方法完成压缩操作。 需要注意的是,要确保添加到zip文件中的文件大小不会超过分卷压缩的大小,否则可能会导致压缩失败。 以上就是使用zip4j实现分卷压缩的代码示例。希望对你有帮助! ### 回答3: zip4j是一个用于处理zip文件的Java库。它可以创建、提取和修改zip文件,并支持分卷压缩。下面是一个使用zip4j实现分卷压缩的示例代码: ```java import net.lingala.zip4j.ZipFile; import net.lingala.zip4j.model.ZipParameters; import java.io.File; import java.util.ArrayList; public class Zip4jExample { public static void main(String[] args) { String sourceFolderPath = "path/to/source/folder"; String destinationFolderPath = "path/to/destination/folder"; String zipFileName = "archive.zip"; String password = "password"; int splitSize = 1024 * 1024; // 分卷大小,这里设置为1MB try { // 创建ZipFile对象并设置分卷大小 ZipFile zipFile = new ZipFile(destinationFolderPath + File.separator + zipFileName); zipFile.setSplitArchive(true); zipFile.setSplitLength(splitSize); // 创建ZipParameters对象并设置压缩参数 ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); parameters.setEncryptFiles(true); parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); parameters.setPassword(password); // 获取源文件夹下的所有文件 File[] sourceFiles = new File(sourceFolderPath).listFiles(); // 将文件添加到zip文件中 ArrayList<File> filesToAdd = new ArrayList<>(); for (File file : sourceFiles) { filesToAdd.add(file); } zipFile.addFiles(filesToAdd, parameters); System.out.println("分卷压缩完成!"); } catch (Exception e) { e.printStackTrace(); } } } ``` 以上代码示例中,首先创建一个ZipFile对象,设置了分卷大小,并指定了压缩文件的路径和名称。然后创建ZipParameters对象,设置了压缩参数,包括压缩算法、加密算法和密码等。接下来获取源文件夹下的所有文件,并将文件添加到zip文件中。最后输出"分卷压缩完成!"表示压缩过程结束。 请注意,上述示例代码中使用了zip4j的常量变量,如Zip4jConstants.COMP_DEFLATE和Zip4jConstants.ENC_METHOD_AES。在使用该示例代码之前,您需要将zip4j库添加到Java项目的依赖中,并导入相关的zip4j类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值