zip4j源码地址
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.7.0</version>
</dependency>
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.io.outputstream.ZipOutputStream;
import net.lingala.zip4j.model.enums.AesKeyStrength;
import net.lingala.zip4j.model.enums.CompressionLevel;
import net.lingala.zip4j.model.enums.CompressionMethod;
import net.lingala.zip4j.model.enums.EncryptionMethod;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.ZipParameters;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
public class ZipUtils {
public static void zipOutputStream(OutputStream outputStream, List<File> filesToAdd, String password) {
ZipParameters zipParameters = new ZipParameters();
zipParameters.setCompressionMethod(CompressionMethod.DEFLATE);
zipParameters.setCompressionLevel(CompressionLevel.NORMAL);
if (StringUtils.isNotEmpty(password)) {
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);
zipParameters.setEncryptFiles(true);
}
try (ZipOutputStream zos = initializeZipOutputStream(outputStream, password)) {
for (File fileToAdd : filesToAdd) {
if (zipParameters.getCompressionMethod() == CompressionMethod.STORE) {
zipParameters.setEntrySize(fileToAdd.length());
}
do_file_toZip(fileToAdd, zos, zipParameters, fileToAdd.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static ZipOutputStream initializeZipOutputStream(OutputStream outputStream, String password) throws IOException {
if (StringUtils.isNotEmpty(password)) {
return new ZipOutputStream(outputStream, password.toCharArray());
}
return new ZipOutputStream(outputStream);
}
private static void do_file_toZip(File sourceFile, ZipOutputStream zos, ZipParameters zipParameters, String name) throws Exception {
byte[] buf = new byte[4096];
if (sourceFile.isFile()) {
zipParameters.setFileNameInZip(name);
zos.putNextEntry(zipParameters);
int readLen;
try (InputStream inputStream = new FileInputStream(sourceFile)) {
while ((readLen = inputStream.read(buf)) != -1) {
zos.write(buf, 0, readLen);
}
}
zos.closeEntry();
} else {
File[] listFiles = sourceFile.listFiles();
if (listFiles == null || listFiles.length == 0) {
zipParameters.setFileNameInZip(name + "/");
zos.putNextEntry(zipParameters);
zos.closeEntry();
} else {
for (File file : listFiles) {
do_file_toZip(file, zos, zipParameters, name + "/" + file.getName());
}
}
}
}
public static String compress(String destFileName, String passwd, File... files) {
try {
ZipParameters zipParameters = new ZipParameters();
zipParameters.setCompressionMethod(CompressionMethod.DEFLATE);
zipParameters.setCompressionLevel(CompressionLevel.NORMAL);
zipParameters.setIncludeRootFolder(true);
ZipFile zipFile;
if (StringUtils.isNotBlank(passwd)) {
zipParameters.setEncryptFiles(true);
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);
zipFile = new ZipFile(destFileName, passwd.toCharArray());
} else {
zipParameters.setEncryptFiles(false);
zipParameters.setEncryptionMethod(EncryptionMethod.NONE);
zipFile = new ZipFile(destFileName);
}
zipFile.setCharset(StandardCharsets.UTF_8);
for (File file : files) {
if (file.exists()) {
if (file.isDirectory()) {
zipFile.addFolder(file, zipParameters);
} else {
zipFile.addFile(file, zipParameters);
}
}
}
return destFileName;
} catch (ZipException e) {
e.printStackTrace();
}
return null;
}
public static String compress(String destFileName, String passwd, String... filePaths) {
int size = filePaths.length;
File[] files = new File[size];
for (int i = 0; i < size; i++) {
files[i] = new File(filePaths[i]);
}
return compress(destFileName, passwd, files);
}
public static String compressFolder(String destFileName, String passwd, File folder) {
if (folder.exists()) {
File[] files = folder.listFiles();
return compress(destFileName, passwd, files);
}
return null;
}
public static File[] deCompress(File zipFile, String dest, String passwd) throws ZipException {
File destDir = new File(dest);
if (destDir.isDirectory() && !destDir.exists()) {
destDir.mkdir();
}
ZipFile zFile = new ZipFile(zipFile);
zFile.setCharset(StandardCharsets.UTF_8);
if (!zFile.isValidZipFile()) {
throw new ZipException("压缩文件不合法,可能被损坏.");
}
if (zFile.isEncrypted()) {
zFile.setPassword(passwd.toCharArray());
}
zFile.extractAll(dest);
List<FileHeader> headerList = zFile.getFileHeaders();
List<File> extractedFileList = new ArrayList<>();
for (FileHeader fileHeader : headerList) {
if (!fileHeader.isDirectory()) {
extractedFileList.add(new File(destDir, fileHeader.getFileName()));
}
}
File[] extractedFiles = new File[extractedFileList.size()];
extractedFileList.toArray(extractedFiles);
return extractedFiles;
}
public static File[] deCompress(File zipFile, String dest) {
try {
return deCompress(zipFile, dest, null);
} catch (ZipException e) {
e.printStackTrace();
}
return null;
}
public static File[] deCompress(String zipFilePath, String dest, String passwd) {
try {
return deCompress(new File(zipFilePath), dest, passwd);
} catch (ZipException e) {
e.printStackTrace();
}
return null;
}
public static File[] deCompress(String zipFilePath, String dest) {
try {
return deCompress(new File(zipFilePath), dest, null);
} catch (ZipException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws IOException {
String rootTemp = "D:/xxxproject";
File file = new File(rootTemp);
for (int i = 0; i < 3; i++) {
File file1 = new File("D:/test.xls");
File file2 = new File(rootTemp + "/" + i + "/a1/a2");
FileUtils.copyFileToDirectory(file1, file2);
File file3 = new File(rootTemp + "/" + i + "/b1/b2");
file3.mkdirs();
}
compressFolder(rootTemp + ".zip", "", file);
FileUtils.deleteDirectory(file);
List<File> list = new ArrayList<>();
list.add(new File("D:/360SoftMgrGame"));
zipOutputStream(new FileOutputStream("D:/sign.zip"), list, "");
System.err.println("完成");
}
}