Java基于zip4j实现多文件加密压缩解/解密解压缩
引入依赖
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.6.0</version>
</dependency>
代码实现
public static void zipFilesAndEncrypt(String zipFileName, String compressionPw, File... files) throws Exception {
try {
int fileLength = files.length;
if (fileLength > 0) {
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(CompressionMethod.DEFLATE);
parameters.setCompressionLevel(CompressionLevel.NORMAL);
parameters.setEncryptFiles(true);
if (!(compressionPw == null || "".equals(compressionPw))) {
parameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);
ZipFile zipFile = new ZipFile(zipFileName);
zipFile.setPassword(compressionPw.toCharArray());
ArrayList<File> filesToAdd = new ArrayList<>(10);
filesToAdd.addAll(Arrays.asList(files));
zipFile.setCharset(Charset.forName("UTF-8"));
zipFile.addFiles(filesToAdd, parameters);
}
}
} catch (Exception e) {
e.printStackTrace();
throw new Exception("文件压缩失败");
}
}
public static boolean compress(String destFileName, String password, File... files) throws ZipException {
try {
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(CompressionMethod.DEFLATE);
parameters.setCompressionLevel(CompressionLevel.NORMAL);
if (!(password == null || "".equals(password))) {
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);
}
ZipFile zipFile = new ZipFile(destFileName);
if (!(password == null || "".equals(password))) {
zipFile.setPassword(password.toCharArray());
}
for (File file : files) {
zipFile.addFile(file, parameters);
}
return true;
} catch (ZipException e) {
e.printStackTrace();
throw new ZipException(e);
}
}
public static boolean compress(String destFileName, String password, String... filePaths) throws ZipException {
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, password, files);
}
public static boolean compressFolder(String destFileName, String password, String folder) throws ZipException {
File folderParam = new File(folder);
if (folderParam.isDirectory()) {
File[] files = folderParam.listFiles();
return compress(destFileName, password, files);
}
return false;
}
public static File[] deCompress(File zipFile, String dest, String password) throws ZipException {
File destDir = new File(dest);
if (destDir.isDirectory() && !destDir.exists()) {
boolean mkdir = destDir.mkdir();
System.out.println(mkdir);
}
ZipFile zFile = new ZipFile(zipFile);
zFile.setCharset(Charset.forName("UTF-8"));
if (!zFile.isValidZipFile()) {
throw new ZipException("压缩文件不合法,可能被损坏.");
}
if (zFile.isEncrypted()) {
zFile.setPassword(password.toCharArray());
}
zFile.extractAll(dest);
List headerList = zFile.getFileHeaders();
List<File> extractedFileList = new ArrayList<>();
for (Object object : headerList) {
FileHeader fileHeader = (FileHeader) object;
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) throws ZipException {
try {
return deCompress(zipFile, dest, null);
} catch (ZipException e) {
e.printStackTrace();
throw new ZipException(e);
}
}
public static File[] deCompress(String zipFilePath, String dest, String password) throws ZipException {
try {
return deCompress(new File(zipFilePath), dest, password);
} catch (ZipException e) {
e.printStackTrace();
throw new ZipException(e);
}
}
public static File[] deCompress(String zipFilePath, String dest) throws ZipException {
try {
return deCompress(new File(zipFilePath), dest, null);
} catch (ZipException e) {
e.printStackTrace();
throw new ZipException(e);
}
}
效果展示