<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.11.5</version>
</dependency>
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.CompressionLevel;
import net.lingala.zip4j.model.enums.CompressionMethod;
import net.lingala.zip4j.model.enums.EncryptionMethod;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
public class ZipUtils {
public static String zipDir(String dirPath, String zipPath, String password) {
try {
File dirFile = new File(dirPath);
if (!dirFile.exists()) {
return null;
}
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(CompressionMethod.DEFLATE);
parameters.setCompressionLevel(CompressionLevel.NORMAL);
ZipFile zipFile;
if (StringUtils.isNotBlank(password)) {
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);
zipFile = new ZipFile(zipPath, password.toCharArray());
} else {
zipFile = new ZipFile(zipPath);
}
if (dirFile.isDirectory()) {
zipFile.addFolder(dirFile, parameters);
} else {
zipFile.addFile(dirFile, parameters);
}
return zipPath;
} catch (IOException e) {
return null;
}
}
public static String zip(String dirPath, String zipPath, String password) {
try {
File dirFile = new File(dirPath);
if (!dirFile.exists()) {
return null;
}
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(CompressionMethod.DEFLATE);
parameters.setCompressionLevel(CompressionLevel.NORMAL);
ZipFile zipFile;
if (StringUtils.isNotBlank(password)) {
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);
zipFile = new ZipFile(zipPath, password.toCharArray());
} else {
zipFile = new ZipFile(zipPath);
}
if (dirFile.isDirectory()) {
File[] files = dirFile.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
zipFile.addFolder(file, parameters);
} else {
zipFile.addFile(file, parameters);
}
}
}
} else {
zipFile.addFile(dirFile, parameters);
}
return zipPath;
} catch (IOException e) {
return null;
}
}
public static List<File> unzip(String dirPath, String zipPath, String password) {
try {
if (password == null) {
password = "";
}
File sourceFile = new File(zipPath);
if (!sourceFile.exists()) {
return null;
}
ZipFile zipFile = new ZipFile(sourceFile, password.toCharArray());
zipFile.setCharset(StandardCharsets.UTF_8);
List<FileHeader> headers = zipFile.getFileHeaders();
if (isRandomCode(headers)) {
zipFile = new ZipFile(sourceFile, password.toCharArray());
zipFile.setCharset(Charset.forName("GBK"));
headers = zipFile.getFileHeaders();
}
File dirFile = new File(dirPath);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
zipFile.extractAll(dirPath);
ArrayList<File> extractFileList = new ArrayList<>();
for (FileHeader header : headers) {
if (header.getFileName().toLowerCase().contains("zip") || header.getFileName().toLowerCase().contains("rar")) {
File file = new File(dirFile, header.getFileName());
List<File> unzip = unzip(file.getAbsolutePath(), dirPath, password);
extractFileList.addAll(unzip);
}
if (!header.isDirectory() || !header.getFileName().toLowerCase().contains("zip") || !header.getFileName().toLowerCase().contains("rar")) {
extractFileList.add(new File(dirFile, header.getFileName()));
}
}
return extractFileList;
} catch (ZipException e) {
return null;
}
}
private static boolean isRandomCode(List<FileHeader> headers) {
for (FileHeader header : headers) {
boolean canEncode = Charset.forName("GBK").newEncoder().canEncode(header.getFileName());
if (!canEncode) {
return true;
}
}
return false;
}
public static void main(String[] args) {
String zip = zip("D:/test", "D:/test.zip", null);
List<File> unzip = unzip("D:/test", "D:/test.zip", null);
}
}