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种):
- static final int COMP_STORE = 0;(仅打包,不压缩) (对应好压的存储)
- static final int COMP_DEFLATE = 8;(默认) (对应好压的标准)
- static final int COMP_AES_ENC = 99;
压缩级别有5种:(默认0不压缩)级别跟好压软件是对应的;
- static final int DEFLATE_LEVEL_FASTEST = 1;
- static final int DEFLATE_LEVEL_FAST = 3;
- static final int DEFLATE_LEVEL_NORMAL = 5;
- static final int DEFLATE_LEVEL_MAXIMUM = 7;
- static final int DEFLATE_LEVEL_ULTRA = 9;
加密方式:
- static final int ENC_NO_ENCRYPTION = -1;(默认,没有加密方法,如果采用此字段,会报错”没有提供加密算法”)
- static final int ENC_METHOD_STANDARD = 0;
- static final int ENC_METHOD_AES = 99;
AES Key Strength:
- (默认-1,也就是ENC_NO_ENCRYPTION)
- static final int AES_STRENGTH_128 = 0x01;
- static final int AES_STRENGTH_192 = 0x02;
- static final int AES_STRENGTH_256 = 0x03;
从构造方法可以默认情况:
- compressionMethod = Zip4jConstants.COMP_DEFLATE;
- encryptFiles = false;//不设密码
- readHiddenFiles = true;//可见
- encryptionMethod = Zip4jConstants.ENC_NO_ENCRYPTION;//加密方式不加密
- aesKeyStrength = -1;//
- includeRootFolder = true;//
- 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();
}
}
}
}
}