package com.jay.test.zip;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipTest {
public static void main(String[] args) throws Exception {
packZipFile("D:\\test", "test.zip", "D:\\test", true);
}
/**
* 打包zip文件
*
* @param parentFilePath
* @param zipFileName
* zip文件的名称 比如 test.zip
* @param zipFilePath
* zip的文件路径比如D:\test
* @param zipExistDel
* zip文件存在时,是否首先删除
* @throws Exception
*/
public static void packZipFile(String parentFilePath, String zipFileName, String zipFilePath, boolean zipExistDel)
throws Exception {
checkNotEmptyParam("请输入合法的以.zip结尾的名字", zipFileName);
checkNotEmptyParam("请输入合法的文件路径", zipFilePath);
checkNotEmptyParam("请输入合法的需要读取的文件路径", parentFilePath);
// 1、根据父路径查询其下面的子文件,并把这些文件按照之前的样子拷贝到zip文件中。
// 2、新建一个zip文件
// 3、新建一份打包说明,把文件备注进去。
File parentFile = new File(parentFilePath);
if (!parentFile.exists()) {
checkNotEmptyParam("需要读取的文件不存在!!!", null);
return;
}
File zipFile = new File(zipFilePath + File.separator + zipFileName);
if (zipFile.exists()) {
zipFile.delete();
}
List fileList = new ArrayList();
listAllFile(parentFilePath, fileList);
if (fileList.size() < 0) {
return;
}
// 需要生成的zip文件
OutputStream out = new FileOutputStream(zipFile);
// 读取文件信息
FileInputStream fileInputStream = null;
byte[] b = new byte[1024];
// 往外输出zip文件信息
ZipOutputStream zipOutputStream = new ZipOutputStream(out);
// 新建zip文件条目
ZipEntry zipEntry = null;
for (File fi : fileList) {
// 非目录才需要写入
if (!fi.isDirectory()) {
fileInputStream = new FileInputStream(fi);
zipEntry = new ZipEntry(fi.getName());
zipOutputStream.putNextEntry(zipEntry);
while (fileInputStream.read(b) != -1) {
zipOutputStream.write(b);
}
} else {
//如果是文件夹的话,需要加入这句话。
//这个是因为ZipEntry有个方法是这样写的
// public boolean isDirectory() {
// return name.endsWith("/");
// }
zipEntry = new ZipEntry(fi.getName()+"/");
zipOutputStream.putNextEntry(zipEntry);
}
}
fileInputStream.close();
zipOutputStream.close();
}
/**
* 检测非法参数
*
* @param exceptionDes
* 异常描述
* @param param
* 参数
* @throws Exception
* 异常信息
*/
private static void checkNotEmptyParam(String exceptionDes, String param) throws Exception {
if (param == null || "".equals(param)) {
throw new Exception(exceptionDes);
}
}
/**
* 根据文件路径获取其下面的文件和目录,支持多层目录获取
*
* @param filePath
* 文件路径
* @param files
* 该目录或文件下所有的文件
*/
public static void listAllFile(String filePath, List files) {
File file = new File(filePath);
File[] files2 = file.listFiles();
if (files2 != null) {
for (File fi : files2) {
// 如果文件是目录,需要递归获取其下面的文件
if (fi.isDirectory()) {
listAllFile(fi.getAbsolutePath(), files);
}
files.add(fi);
}
}
}
}