Zip4j是一款用于Java环境下的开源库,版本1.3.2提供强大的功能支持ZIP格式文件的压缩及解压操作,简化开发者的编码工作。
使用给定密码压缩指定文件或文件夹到指定位置。
dest参数可以是最终压缩文件存放的绝对路径、也可以是指定目录或者传null或者空字符串。
如果传入的是null或者空字符串,那么将把压缩文件存放在当前目录中,并且以源文件名作为压缩文件名,后缀为.zip;
如果是以路径分隔符结尾,则视为目录处理;否则视为指定的最终压缩文件存放位置。
参数说明:
- src:要被压缩的文件或文件夹路径。
- dest:生成的压缩包存放的位置。
- isCreateDir:是否在压缩后的归档中创建目录结构,仅当dest为目录时有效。如果设置为false,则直接将给定目录下的所有文件打包到一个zip包内而无任何子目录信息;
- passwd:用于加密和解密zip文件的密码。
```java
public static String zip(String src, String dest, boolean isCreateDir, String passwd) {
File sourceFile = new File(src);
ZipParameters parameters = new ZipParameters();
// 设置压缩方式为DEFLATE,级别为正常。
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
if (passwd != null && !.equals(passwd.trim())) {
// 开启加密
parameters.setEncryptFiles(true);
// 设置为标准的加密方式。
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
// 设置密码,使用给定的字符串作为密钥。
parameters.setPassword(passwd.toCharArray());
}
try {
ZipFile zip = new ZipFile(dest);
if (sourceFile.isDirectory()) {
// 如果不创建目录的话,将直接把给定目录下的文件压缩到zip包里
if (!isCreateDir) {
File[] subFiles = sourceFile.listFiles();
ArrayList filesList = new ArrayList<>();
Collections.addAll(filesList, subFiles);
zip.addFiles(filesList, parameters);
return dest;
}
// 如果创建目录的话,则会生成一个包含源文件夹结构的zip包
zip.addFolder(sourceFile, parameters);
} else {
// 压缩单个文件到指定路径。
zip.addFile(sourceFile, parameters);
}
return dest;
} catch (ZipException e) {
e.printStackTrace();
return null;
}
}
```
使用给定密码解压指定的ZIP压缩文件到指定目录。
如果目标目录不存在,可以自动创建;不合法路径将导致异常被抛出。
```java
public static File[] unzip(File zipFile, String dest, String passwd) throws ZipException {
ZipFile zfile = new ZipFile(zipFile);
// 设置解压时使用的文件编码格式为GBK。
zfile.setFileNameCharset(GBK);
if (!zfile.isValidZipFile()) {
throw new ZipException(压缩包不合法,可能已损坏。);
}
if (dest == null || .equals(dest.trim())) {
dest = zipFile.getParentFile().getAbsolutePath();
}
File destinationDir = new File(dest);
// 如果目标目录不存在,则创建它。
if (!destinationDir.exists() && !destinationDir.mkdirs()) {
throw new ZipException(无法创建解压的目标文件夹。);
}
if (zfile.isEncrypted()) {
zfile.setPassword(passwd.toCharArray());
}
// 解压缩到指定的目录中
zfile.extractAll(dest);
List headerList = zfile.getFileHeaders();
ArrayList extractedFileList = new ArrayList<>();
for(FileHeader fileHeader : headerList) {
if (!fileHeader.isDirectory()) {
File entry = new File(destinationDir, fileHeader.getFileName());
// 将解压后的文件添加到列表中。
extractedFileList.add(entry);
}
}
return extractedFileList.toArray(new File[extractedFileList.size()]);
}