package com.zyuc.zipfile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
/**
* 解压ZIP压缩文件到指定的目录
* @title: UnZipFile
* @description:
* @author wangxw
* @since 2012-4-11下午01:55:22
* @version 1.0
*/
public final class UnZipFile {
/**
*
* 缓存区大小默认20480
*
*/
private final static int FILE_BUFFER_SIZE = 20480;
private UnZipFile() {}
/**
*
* 将指定目录的ZIP压缩文件解压到指定的目录
* @param zipFilePath ZIP压缩文件的路径
* @param zipFileName ZIP压缩文件名字
* @param targetFileDir ZIP压缩文件要解压到的目录
* @return flag 布尔返回值
*
*/
public static boolean unzip(String zipFilePath, String zipFileName, String targetFileDir){
boolean flag = false;
// 1.判断压缩文件是否存在,以及里面的内容是否为空
File file = null; // 压缩文件(带路径)
ZipFile zipFile = null;
file = new File(zipFilePath + "/" + zipFileName);
if(false == file.exists()) {
System.out.println(">>>>>>压缩文件【" + zipFilePath + "/" + zipFileName + "】不存在<<<<<
return false;
}else {
// 2.开始解压ZIP压缩文件的处理
System.out.println(">>>>>>解压文件【" + zipFilePath + "/" + zipFileName + "】到【" + targetFileDir + "】目录下<<<<<
byte[] buf = new byte[FILE_BUFFER_SIZE];
int readSize = -1;
ZipInputStream zis = null;
FileOutputStream fos = null;
try {
// 检查是否是zip文件
zipFile = new ZipFile(file);
zipFile.close();
// 判断目标目录是否存在,不存在则创建
File newdir = new File(targetFileDir);
if (false == newdir.exists()) {
newdir.mkdirs();
newdir = null;
}
zis = new ZipInputStream(new FileInputStream(file));
ZipEntry zipEntry = zis.getNextEntry();
// 开始对压缩包内文件进行处理
while (null != zipEntry) {
String zipEntryName = zipEntry.getName().replace('\\', '/');
// 判断zipEntry是否为目录,如果是,则创建
if(zipEntry.isDirectory()) {
int indexNumber = zipEntryName.lastIndexOf('/');
File entryDirs = new File(targetFileDir + "/" + zipEntryName.substring(0, indexNumber));
entryDirs.mkdirs();
entryDirs = null;
} else {
try {
fos = new FileOutputStream(targetFileDir + "/" + zipEntryName);
while ((readSize = zis.read(buf, 0, FILE_BUFFER_SIZE)) != -1) {
fos.write(buf, 0, readSize);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getCause());
} finally {
try {
if (null != fos) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e.getCause());
}
}
}
zipEntry = zis.getNextEntry();
}
flag = true;
} catch (ZipException e) {
e.printStackTrace();
throw new RuntimeException(e.getCause());
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e.getCause());
} finally {
try {
if (null != zis) {
zis.close();
}
if (null != fos) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e.getCause());
}
}
}
return flag;
}
/**
*
* 测试用的Main方法
*
*/
public static void main(String[] args) {
String zipFilePath = "D:\\test";
String zipFileName = "qqqq.zip";
String targetFileDir = "D:\\test";
boolean flag = UnZipFile.unzip(zipFilePath, zipFileName, targetFileDir);
if(flag) {
System.out.println(">>>>>>解压成功<<<<<
} else {
System.out.println(">>>>>>解压失败<<<<<
}
}
}