您的位置:首页 > 编程语言 > Java开发

Java压缩和解压文件工具类ZipUtil

2016-08-18 10:45 543 查看
</pre><pre code_snippet_id="1837335" snippet_file_name="blog_20160818_2_1853501" name="code" class="java">packagecom.utility.zip;

importjava.io.BufferedInputStream;
importjava.io.BufferedOutputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipInputStream;
importjava.util.zip.ZipOutputStream;

importcom.utility.io.IOUtil;

/**
* 通过Java的Zip输入输出流实现压缩和解压文件
*
* @author liujiduo
*
*/
publicfinal class ZipUtil {

privateZipUtil() {
// empty
}

/**
* 压缩文件
*
* @param filePath
*            待压缩的文件路径
* @return 压缩后的文件
*/
publicstatic File zip(String filePath) {
File target = null;
File source = newFile(filePath);
if(source.exists()) {
// 压缩文件名=源文件名.zip
String zipName = source.getName() + ".zip";
target = newFile(source.getParent(), zipName);
if(target.exists()) {
target.delete();// 删除旧的文件
}
FileOutputStream fos = null;
ZipOutputStream zos = null;
try{
fos = newFileOutputStream(target);
zos = newZipOutputStream(newBufferedOutputStream(fos));
// 添加对应的文件Entry
addEntry("/", source, zos);
}catch(IOException e) {
thrownew RuntimeException(e);
}finally{
IOUtil.closeQuietly(zos, fos);
}
}
returntarget;
}

/**
* 扫描添加文件Entry
*
* @param base
*            基路径
*
* @param source
*            源文件
* @param zos
*            Zip文件输出流
* @throws IOException
*/
privatestatic void addEntry(String base, File source, ZipOutputStream zos)
throwsIOException {
// 按目录分级,形如:/aaa/bbb.txt
String entry = base + source.getName();
if(source.isDirectory()) {
for(File file : source.listFiles()) {
// 递归列出目录下的所有文件,添加文件Entry
addEntry(entry + "/", file, zos);
}
}else{
FileInputStream fis = null;
BufferedInputStream bis = null;
try{
byte[] buffer = newbyte[1024* 10];
fis = newFileInputStream(source);
bis = newBufferedInputStream(fis, buffer.length);
intread = 0;
zos.putNextEntry(newZipEntry(entry));
while((read = bis.read(buffer, 0, buffer.length)) != -1) {
zos.write(buffer,0, read);
}
zos.closeEntry();
}finally{
IOUtil.closeQuietly(bis, fis);
}
}
}

/**
* 解压文件
*
* @param filePath
*            压缩文件路径
*/
publicstatic void unzip(String filePath) {
File source = newFile(filePath);
if(source.exists()) {
ZipInputStream zis = null;
BufferedOutputStream bos = null;
try{
zis = newZipInputStream(newFileInputStream(source));
ZipEntry entry = null;
while((entry = zis.getNextEntry()) != null
&& !entry.isDirectory()) {
File target = newFile(source.getParent(), entry.getName());
if(!target.getParentFile().exists()) {
// 创建文件父目录
target.getParentFile().mkdirs();
}
// 写入文件
bos = newBufferedOutputStream(newFileOutputStream(target));
intread = 0;
byte[] buffer = newbyte[1024* 10];
while((read = zis.read(buffer, 0, buffer.length)) != -1) {
bos.write(buffer,0, read);
}
bos.flush();
}
zis.closeEntry();
}catch(IOException e) {
thrownew RuntimeException(e);
}finally{
IOUtil.closeQuietly(zis, bos);
}
}
}

publicstatic void main(String[] args) {
String targetPath = "E:\\Win7壁纸";
File file = ZipUtil.zip(targetPath);
System.out.println(file);
ZipUtil.unzip("F:\\Win7壁纸.zip");
}
}

packagecom.utility.io;

importjava.io.Closeable;
importjava.io.IOException;

/**
* IO流工具类
*
* @author liujiduo
*
*/
publicclass IOUtil {
/**
* 关闭一个或多个流对象
*
* @param closeables
*            可关闭的流对象列表
* @throws IOException
*/
publicstatic void close(Closeable... closeables) throwsIOException {
if(closeables != null) {
for(Closeable closeable : closeables) {
if(closeable != null) {
closeable.close();
}
}
}
}

/**
* 关闭一个或多个流对象
*
* @param closeables
*            可关闭的流对象列表
*/
publicstatic void closeQuietly(Closeable... closeables) {
try{
close(closeables);
}catch(IOException e) {
// do nothing
}
}

}


用于服务器端打包文件的,将压缩后的文件写入到response输出流即可实现在服务器端打包下载,支持多级目录嵌套。
测试时可以先用ZipUtil.zip压缩某个文件夹test,得到压缩文件test.zip,然后将文件夹test删除,用ZipUtil.unzip解压test.zip即可还原。

PS:需要解决中文乱码的朋友可以参考此处 http://log-cd.iteye.com/blog/585647
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  zip压缩