Java_Zip4学习
- 在pom文件映入 zip4.jar包
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
zip4官网路径: http://www.lingala.net/zip4j.html
- 自己封装工具
/**
* 压缩成ZIP
* @param srcFileList 需要压缩的文件列表
* @param zipDic 压缩文件目录
* @param zipName 压缩文件名称
*/
public static String toZip(List<String> srcFileList, String zipDic,String zipName) {
File filePath = new File(zipDic);
if (!filePath.exists()) {
filePath.mkdirs();
}
String zipFileAddress=zipDic+zipName;
List<File> versionZip = new ArrayList<File>();
for (String srcFile : srcFileList) {
versionZip.add(new File(srcFile));
}
OutputStream fileOutputStream = null;
ZipOutputStream zipOutputStream = null;
try {
fileOutputStream = new FileOutputStream(new File(zipFileAddress));
zipOutputStream = new ZipOutputStream(fileOutputStream);
for (File srcFile : versionZip) {
zipOutputStream.putNextEntry(new ZipEntry(srcFile.getName()));
InputStream fileInputStream = new BufferedInputStream(new FileInputStream(srcFile));
IOUtils.copy(fileInputStream, zipOutputStream);
fileInputStream.close();
zipOutputStream.flush();
zipOutputStream.closeEntry();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//封装的静静关闭流,根据具体项目替换流关闭方法
IOUtil.closeQuietly(zipOutputStream);
IOUtil.closeQuietly(fileOutputStream);
}
return zipFileAddress;
}
/**
* 压缩文件夹
* @param Dic 压缩的文件夹
* @param zipDic 压缩后文件夹存储路径
* @param keepDirStructure 是否保留原有的目录结构;true:保持原有的目录结构 ;false:不保存
* @return
*/
public static boolean toZipByDic(String Dic ,String zipDic,Boolean keepDirStructure){
File filePath = new File(zipDic);
if (!filePath.exists()) {
return false;
}
ZipOutputStream zipOutputStream = null;
try {
zipOutputStream = new ZipOutputStream(new FileOutputStream(new File(zipDic)));
File sourceFile = new File(Dic);
compress(sourceFile, zipOutputStream, sourceFile.getName(), keepDirStructure);
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtil.closeQuietly(zipOutputStream);
}
return true;
}
/**
* 递归式压缩文件夹
* @param sourceFile
* @param zipOutputStream
* @param name
* @param keepDirStructure
*/
private static void compress(File sourceFile, ZipOutputStream zipOutputStream, String name,boolean keepDirStructure) {
InputStream fileInputStream =null;
try {
if (sourceFile.isFile()) {
zipOutputStream.putNextEntry(new ZipEntry(name));
fileInputStream=new BufferedInputStream(new FileInputStream(sourceFile));
IOUtils.copy(fileInputStream, zipOutputStream);
zipOutputStream.closeEntry();
} else {
File[] listFiles = sourceFile.listFiles();
if (listFiles == null || listFiles.length == 0) {
if (keepDirStructure) {
zipOutputStream.putNextEntry(new ZipEntry(name +File.separator));
zipOutputStream.closeEntry();
}
} else {
for (File file : listFiles) {
if (keepDirStructure) {
compress(file, zipOutputStream, name+ File.separator + file.getName(), keepDirStructure);
} else {
compress(file, zipOutputStream, file.getName(), keepDirStructure);
}
}
}
}
}catch(Exception e){
e.printStackTrace();
}finally {
IOUtil.closeQuietly(fileInputStream);
}
}
/**
* 压缩文件夹并加密
* @param Dic
* @param zipDic
* @param zipName
* @param password
*/
public static void zipFileAndEncrypt(String Dic ,String zipDic,String zipName,String password){
File filePath = new File(zipDic);
if (!filePath.exists()) {
filePath.mkdirs();
}
try {
ZipFile zipFile = new ZipFile(zipDic+zipName);
ZipParameters zipParameters = new ZipParameters();
zipParameters.setEncryptFiles(true);
zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
zipParameters.setPassword(password);
zipFile.addFolder(new File(Dic), zipParameters);
} catch (ZipException e) {
e.printStackTrace();
}
}