Java压缩、解压ZIP
package com.util;
import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class ZIPUtil {
public static void main(String[] args) throws Exception {
//压缩测试
String src = "D:\\mytest\\test";
String dest = "D:\\mytest\\test1.zip";
File srcFiles = new File(src);
File destFile = new File(dest);
File[] files = srcFiles.listFiles();
zip(destFile, files);
//解压测试
src = "D:\\mytest\\test1.zip";
String destDir = "D:\\mytest\\test2";
File srcFile = new File(src);
unZip(srcFile, destDir);
}
/**
* 压缩<br>
* 支持单个或者多个目录或文件<br>
* 支持多层目录文件,保留空目录<br>
* @param destFile 压缩结果文件
* @param srcFiles 要压缩的文件
*/
public static void zip(File destFile, File... srcFiles) throws Exception {
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destFile));
for (File file : srcFiles) {
compress(zos, file, file.getName());
}
zos.close();
}
/**
* 递归压缩
* @param zos zip输出流
* @param srcFile 要压缩的文件
* @param zipEntryName 压缩后的zip节点名
* @throws Exception
*/
private static void compress(ZipOutputStream zos, File srcFile, String zipEntryName) throws Exception {
// 如果是目录,则创建目录并递归压缩子文件
if (srcFile.isDirectory()) {
// 添加目录
zos.putNextEntry(new ZipEntry(zipEntryName + File.separator));
zos.closeEntry();
// 遍历并压缩子文件
for (File subFile : srcFile.listFiles()) {
String subZipEntryName = zipEntryName + File.separator + subFile.getName();
compress(zos, subFile, subZipEntryName);
}
} else {
// 如果是文件,则压缩文件
zos.putNextEntry(new ZipEntry(zipEntryName));
FileInputStream inputStream = new FileInputStream(srcFile);
int len;
byte[] buf = new byte[1024];
while ((len = inputStream.read(buf)) != -1) {
zos.write(buf, 0, len);
}
inputStream.close();
zos.closeEntry();
}
}
/**
* 解压
* @param srcFile 要解压的文件
* @param destDir 解压输出目录
*/
public static void unZip(File srcFile, String destDir) throws Exception {
ZipFile zipFile = null;
try {
File file = new File(destDir);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
// 开始解压
zipFile = new ZipFile(srcFile);
Enumeration<?> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
// 如果是文件夹,就创建个文件夹
if (entry.getName().endsWith("/") || entry.getName().endsWith("\\")) {
String dirPath = destDir + File.separator + entry.getName();
File dir = new File(dirPath);
dir.mkdirs();
} else {
// 如果是文件,就先创建一个文件,然后用io流把内容copy过去
File targetFile = new File(destDir + File.separator + entry.getName());
// 保证这个文件的父文件夹必须要存在
if (!targetFile.getParentFile().exists()) {
targetFile.getParentFile().mkdirs();
}
targetFile.createNewFile();
// 将压缩文件内容写入到这个文件中
InputStream inputStream = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(targetFile);
int len;
byte[] buf = new byte[1024];
while ((len = inputStream.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.close();
inputStream.close();
}
}
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
if (zipFile != null) {
try {
zipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}