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

java基础之zip(压缩、解压)

2014-07-27 15:18 337 查看
本程序依赖第三方包Ant.jar。因为java自带的java.utils.zip.ZipOutputStream对一些敏感中文路径会抛出异常。

package javax.zip;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
* @author hubiao
* zip文件:压缩、解压
* [支持中文路径]
* 用到工具类jar:org.apache.tools.zip.*
*/
@SuppressWarnings("unchecked")
public class ZIPUtils{
public static void main(String[] args) throws Exception {
/*压缩*/
Compression(new File("F:\\aaaa"),null);

/*解压*/
// Decompression(null,"F://aaaa.zip");

//ZipOutputStream zos = new ZipOutputStream(os,Charset.forName("GBK"));//解决中文路径
}
/**
* 递归打包成zip
* @param outPut zip输出流
* @param listFiles 目录子文件
* @param fuPath 父级目录名称
* @throws Exception
*/
private static void createZip(org.apache.tools.zip.ZipOutputStream outPut,File[] listFiles,String fuPath) throws Exception {
for(File f : listFiles)
{
String name = fuPath==null?f.getName():fuPath+"/"+f.getName();;
if(f.isDirectory())
{
System.out.println("创建目录["+name+"]");
outPut.putNextEntry(new ZipEntry(name+"/"));//这个/一定要加,不然无法创建文件夹咯!
createZip(outPut,f.listFiles(),name);
}else{
System.out.println("创建文件["+name+"]");
outPut.putNextEntry(new ZipEntry(name));
InputStream is = new FileInputStream(f);
byte[] bys = new byte[1024];
int len = 0;
while((len = is.read(bys))!=-1)
outPut.write(bys, 0, len);
is.close();
outPut.flush();
}
}
}
/**
* 解压文件
* @param savePath 解压保存路径
* @param targetFile zip源文件路径
* @throws IOException 解压错误
*/
private static void Decompression(String savePath, String target) throws IOException {
long start = System.currentTimeMillis();
//设置根路径或默认路径(解决路径含有 xx\xxx | aa/aaa )
File targetFile = new File(target);
//默认保存路径
if(savePath==null)
savePath = targetFile.toString().substring(0, targetFile.toString().lastIndexOf("."));
else
savePath = savePath.concat(targetFile.toString().substring(targetFile.toString().lastIndexOf("\\"), targetFile.toString().lastIndexOf(".")));

//遍历所有zip文件
ZipFile zipFile = new ZipFile(targetFile);
Enumeration<ZipEntry> entries = zipFile.getEntries();
OutputStream os = null;
while(entries.hasMoreElements())
{
ZipEntry ze = entries.nextElement();
String name = ze.getName();
InputStream is = zipFile.getInputStream(ze);
//创建文件夹
int last = name.lastIndexOf("/");
File destFile = null;
if(last!=-1){
destFile = new File(savePath,name.substring(0,last));
destFile.mkdirs();
if(name.indexOf(".")==-1)
continue;
destFile = new File(destFile,name.substring(last));//文件夹+文件名称
}else{
destFile = new File(savePath,name);//文件名称
}
System.out.println("正在解压["+name+"]");

//读取zip
byte[] bys = new byte[1024];
int len = 0;
os = new FileOutputStream(destFile);
while((len = is.read(bys))!=-1)
{
os.write(bys,0,len);
os.flush();
}
os.close();
}
long end = System.currentTimeMillis();
System.out.println("****************解压完毕,消耗["+(end-start)+"(ms)];****************");
}
/**
* @param destDir 被压缩的目录
* @param target 压缩保存目录
* @throws Exception
*/
public static void Compression(File destDir, String saveDir) throws Exception {
long start = System.currentTimeMillis();
if(destDir==null || !destDir.exists())
throw new RuntimeException(destDir.toString()+" 不存在!");
if(saveDir==null)
saveDir = destDir.toString()+".zip";
ZipOutputStream outPut = new ZipOutputStream(new FileOutputStream(new File(saveDir)));
outPut.setEncoding("GBK");//设置编码
createZip(outPut,destDir.listFiles(),null);
outPut.flush();
outPut.close();
long end = System.currentTimeMillis();
System.out.println("****************压缩完毕,消耗["+(end-start)+"(ms)];****************");
}
}
如:压缩运行结果:

创建目录[2013]

创建目录[2013/20130508]

创建文件[2013/20130508/20130508001.jpg]

创建文件[2013/20130508/20130508002.jpg]

创建文件[2013/20130508/20130508003.jpg]

创建文件[2013/20130508/20130508004.jpg]

创建文件[2013/20130508/2013050801.xml]

创建文件[2013/20130508/2013050802 - 副本.xml]

创建文件[2013/20130508/2013050802.xml]

创建文件[2013/20130508/2013050803 - 副本.xml]

创建文件[2013/20130508/2013050803.xml]

创建文件[2013/20130508/2013050804.xml]

创建目录[2013/20130508/images]

创建文件[2013/20130508/images/20130508011.jpg]

创建文件[2013/20130508/images/20130508021.jpg]

创建文件[2013/20130508/images/20130508041.jpg]

创建文件[2013/20130508/images/201305080410.jpg]

创建文件[2013/20130508/images/201305080411.jpg]

创建文件[2013/20130508/images/201305080412.jpg]

创建文件[2013/20130508/images/201305080413.jpg]

创建文件[2013/20130508/images/20130508042.jpg]

创建文件[2013/20130508/images/20130508043.jpg]

创建文件[2013/20130508/images/20130508044.jpg]

创建文件[2013/20130508/images/20130508045.jpg]

创建文件[2013/20130508/images/20130508046.jpg]

创建文件[2013/20130508/images/20130508047.jpg]

创建文件[2013/20130508/images/20130508048.jpg]

创建文件[2013/20130508/images/20130508049.jpg]

创建目录[2013/s]

创建文件[2013/s/2013050802.xml]

创建文件[2013/s/2013050803.xml]

创建文件[null/2013050801.xml]

创建文件[null/2013050802 - 副本.xml]

创建目录[车]

创建目录[车/要在]

创建目录[顺要要]

创建目录[顺要要/新建文件夹]

创建目录[顺要要/新建文件夹/sfds]

创建目录[顺要要/新建文件夹/sfds/aadf]

创建目录[顺要要/新建文件夹/新建文件夹 - 副本]

创建目录[顺要要/新建文件夹 - 副本]

****************压缩完毕,消耗[188(ms)];****************
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: