因为jdk自带的zip不支持密码,所以使用第三方包
jar使用jdk1.8编译,但是兼容jdk1.7,部分功能可能会受影响,1.8以上正常
jar点我下载 zip4j.jar
import net.lingala.zip4j.ZipFile; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.model.enums.EncryptionMethod; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Zip4Util { /** * @author: bughz * @description: 解压带密码的zip文件 * @createDate: 2022-07-11 09:40:01 * @param zipFilePath zip文件路径 * @param password 解密密码 * @param targetPath 解压路径 * @return void */ public static void UnzipByPassword(String zipFilePath,String password,String targetPath) throws ZipException { new ZipFile(zipFilePath, password.toCharArray()).extractAll(targetPath); } /** * @author: bughz * @description: 解压zip文件 * @createDate: 2022-07-11 09:40:01 * @param zipFilePath zip文件路径 * @param targetPath 解压路径 * @return void */ public static void unzip(String zipFilePath,String targetPath) throws ZipException { new ZipFile(zipFilePath).extractAll(targetPath); } /** * @author: bughz * @description: 压缩带密码的zip文件(zip标准加密),如果zipPath存在,则将后续文件添加进zipPath * @createDate: 2022-07-11 09:43:07 * @param zipPath 压缩路径以及文件名 * @param password 加密密码 * @param filePaths 文件、多个,必传 * @return void */ public static void zipByPassword(String zipPath,String password,File... filePaths) throws ZipException { if(filePaths==null || filePaths.length==0){ throw new ZipException("param(s) filePaths not null"); } ZipParameters zipParameters = new ZipParameters(); zipParameters.setEncryptFiles(true); zipParameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD); ZipFile zipFile = new ZipFile(zipPath, password.toCharArray()); setFilesOrDirectorys(zipFile,filePaths); } /** * @author: bughz * @description: 压缩zip文件(zip标准加密),如果zipPath存在,则将后续文件添加进zipPath * filePaths包含路径,打包时包含主目录例如 /app/test 打包后包含test * @createDate: 2022-07-11 09:43:07 * @param zipPath 压缩路径以及文件名 * @param filePaths 文件、多个,必传 * @return void */ public static void zip(String zipPath,File... filePaths) throws ZipException { if(filePaths==null || filePaths.length==0){ throw new ZipException("param(s) filePaths not null"); } ZipFile zipFile = new ZipFile(zipPath); setFilesOrDirectorys(zipFile,filePaths); } /** * @author: bughz * @description: 压缩zip文件(zip标准加密),如果zipPath存在,则将后续文件添加进zipPath * filePaths不包含路径,打包时不包含主目录例如 /app/test 打包后主目录是test中的文件 * 多用于压缩目录 * @createDate: 2022-07-11 09:43:07 * @param zipPath 压缩路径以及文件名 * @param noIndexDir true不包含主目录 no @see com.picc.piccbjepicc.util.Zip4Util.zip(String,File...) * @param filePaths 文件、多个,必传 * @return void */ public static void zip(String zipPath,boolean noIndexDir,File... filePaths) throws ZipException { if(filePaths==null || filePaths.length==0){ throw new ZipException("param(s) filePaths not null"); } if(!noIndexDir){ zip(zipPath,filePaths); }else{ List<File> files=new ArrayList<>(); for (File file:filePaths) { if(!file.exists()){ continue; } if(file.isFile()){ files.add(file); }else{ files.addAll(Arrays.asList(file.listFiles())); } } ZipFile zipFile = new ZipFile(zipPath); setFilesOrDirectorys(zipFile,files.toArray(new File[0])); } } /** * @author: bughz * @description: 删除文件 * @createDate: 2022-07-11 09:51:29 * @param files * @return void */ public static void deleteFile(File... files){ if (files == null) { return; } for (File file:files) { deleteDir(file); } } private static void setFilesOrDirectorys(ZipFile zipFile,File... fileOrDirectorys) throws ZipException { List<File> AllFiles=new ArrayList<>(); for (File fileOrDirectory:fileOrDirectorys) { if(!fileOrDirectory.exists()){ continue; } if(fileOrDirectory.isFile()){ AllFiles.add(fileOrDirectory); }else{ zipFile.addFolder(fileOrDirectory); } } if(!AllFiles.isEmpty()){ zipFile.addFiles(AllFiles); } } private static void deleteDir(File fileOrDirectory){ if(fileOrDirectory.isFile()){ fileOrDirectory.delete(); return; } //获取目录下所有文件和目录 File files[] = fileOrDirectory.listFiles(); for (File file : files) { if(file.isDirectory()){ deleteDir(file); }else { file.delete(); } } //最终把该目录也删除 fileOrDirectory.delete(); } }