本程序依赖第三方包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)];****************