项目中有需要解压zip包,但是网上搜了下,工具类过于局限,故整理一个万能的解压zip的工具类。如果大家有更好的方式欢迎交流!
工具类1:
/**
* 解压文件到指定目录
*
* @param zipFile 压缩文件
* @param descDir 指定目录
*/
public static void unZipFiles(File zipFile, String descDir) throws IOException {
File pathFile = new File(descDir);
if (!pathFile.exists()) {
Assert.state(pathFile.mkdirs(), "无法创建目录/文件:" + pathFile);
}
/*
* ZipFile类用于从zip文件中读取条目
* getEntries()返回ZIP文件条目中的枚举
*/
ZipFile zip = new ZipFile(zipFile);
for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) {
ZipEntry entry = (ZipEntry) entries.nextElement();
//解决Linux乱码
entry.setUnixMode(644);
String zipEntryName = entry.getName();
log.debug(zipEntryName);
InputStream in = zip.getInputStream(entry);
String outPath = (descDir + zipEntryName).replaceAll("\\*", "/");
//判断路径是否存在,不存在则创建文件路径
File file = new File(outPath.substring(0,
outPath.lastIndexOf(File.separator)));
if (!file.exists()) {
Assert.state(file.mkdirs(), "无法创建目录/文件:" + file.getAbsolutePath());
}
//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
if (new File(outPath).isDirectory()) {
continue;
}
OutputStream out = new FileOutputStream(outPath);
byte[] buf = new byte[BUFFER_SIZE];
int len;
//Java获取byte数值保存到指定目录
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
log.info("*******************解压完毕********************");
}
局限点:只支持解压zip包中只包含文件,不包含文件夹的zip
工具类2:
/**
* 解压文件到指定目录
*
* @param zipFile 压缩文件
* @param descDir 指定目录
*/
public static void unZipFiles(File zipFile, String descDir) throws IOException {
File pathFile = new File(descDir);
if (!pathFile.exists()) {
Assert.state(pathFile.mkdirs(), "无法创建目录/文件:" + pathFile);
}
/*
* ZipFile类用于从zip文件中读取条目
* getEntries()返回ZIP文件条目中的枚举
*/
ZipFile zip = new ZipFile(zipFile);
for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) {
ZipEntry entry = (ZipEntry) entries.nextElement();
//解决Linux乱码
entry.setUnixMode(644);
String zipEntryName = entry.getName();
log.debug(zipEntryName);
InputStream in = zip.getInputStream(entry);
String outPath = (descDir + zipEntryName).replaceAll("\\*", "/");
//判断路径是否存在,不存在则创建文件路径
File file = new File(outPath.substring(0, outPath.lastIndexOf("/")));
if (!file.exists()) {
Assert.state(file.mkdirs(), "无法创建目录/文件:" + file.getAbsolutePath());
}
//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
if (new File(outPath).isDirectory()) {
continue;
}
OutputStream out = new FileOutputStream(outPath);
byte[] buf = new byte[BUFFER_SIZE];
int len;
//Java获取byte数值保存到指定目录
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
log.info("*******************解压完毕********************");
}
局限点:只能解压zip包下为文件夹的zip
工具类3:(推荐)
/**
* 解压文件到指定目录,包含解压带文件夹和不带文件夹的zip(万能)
*
* @param srcFile 压缩文件
* @param destDirPath 指定目录
*/
public static void unZipFilesSecond(File srcFile,String destDirPath) throws Exception {
if (!srcFile.exists()) {
throw new Exception(srcFile.getPath() + "所指文件不存在");
}
//创建压缩文件对象
ZipFile zipFile = new ZipFile(srcFile);
log.info("*******************开始解压********************");
Enumeration<?> entries = zipFile.getEntries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
// 如果是文件夹,就创建个文件夹
if (entry.isDirectory()) {
String dirPath = destDirPath + "/" + entry.getName();
srcFile.mkdirs();
} else {
// 如果是文件,就先创建一个文件,然后用io流把内容copy过去
File targetFile = new File(destDirPath + "/" + entry.getName());
// 保证这个文件的父文件夹必须要存在
if (!targetFile.getParentFile().exists()) {
targetFile.getParentFile().mkdirs();
}
targetFile.createNewFile();
// 将压缩文件内容写入到这个文件中
InputStream is = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(targetFile);
int len;
byte[] buf = new byte[1024];
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
// 关流顺序,先打开的后关闭
fos.close();
is.close();
}
}
log.info("*******************解压完毕********************");
}
可以解压zip包下含有文件和文件夹的zip