Java解压缩zip - 解压缩多个文件或文件夹

Java解压缩zip - 多个文件(包括文件夹)


对多个文件和文件夹进行压缩,对复杂的文件目录进行解压。

压缩方法使用的是可变参数,可以压缩1到多个文件..可以写数组的方式或者一个个写到参数列表里面...

[java]  view plain copy
  1. ZipFiles(zip,"abc",new File("d:/English"),new File("d:/发放数据.xls"));  


测试文件目录结构:



测试的压缩内容:English文件夹和同级的两个excel文件

[java]  view plain copy
  1. File[] files = new File[]{new File("d:/English"),new File("d:/发放数据.xls"),new File("d:/中文名称.xls")};  

下面是压缩的代码:

[java]  view plain copy
  1. /** 
  2.      * 压缩文件-由于out要在递归调用外,所以封装一个方法用来 
  3.      * 调用ZipFiles(ZipOutputStream out,String path,File... srcFiles) 
  4.      * @param zip 
  5.      * @param path 
  6.      * @param srcFiles 
  7.      * @throws IOException 
  8.      * @author isea533 
  9.      */  
  10.     public static void ZipFiles(File zip,String path,File... srcFiles) throws IOException{  
  11.         ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zip));  
  12.         ZipTest.ZipFiles(out,path,srcFiles);  
  13.         out.close();  
  14.         System.out.println("*****************压缩完毕*******************");  
  15.     }  
  16.     /** 
  17.      * 压缩文件-File 
  18.      * @param zipFile  zip文件 
  19.      * @param srcFiles 被压缩源文件 
  20.      * @author isea533 
  21.      */  
  22.     public static void ZipFiles(ZipOutputStream out,String path,File... srcFiles){  
  23.         path = path.replaceAll("\\*""/");  
  24.         if(!path.endsWith("/")){  
  25.             path+="/";  
  26.         }  
  27.         byte[] buf = new byte[1024];  
  28.         try {  
  29.             for(int i=0;i<srcFiles.length;i++){  
  30.                 if(srcFiles[i].isDirectory()){  
  31.                     File[] files = srcFiles[i].listFiles();  
  32.                     String srcPath = srcFiles[i].getName();  
  33.                     srcPath = srcPath.replaceAll("\\*""/");  
  34.                     if(!srcPath.endsWith("/")){  
  35.                         srcPath+="/";  
  36.                     }  
  37.                     out.putNextEntry(new ZipEntry(path+srcPath));  
  38.                     ZipFiles(out,path+srcPath,files);  
  39.                 }  
  40.                 else{  
  41.                     FileInputStream in = new FileInputStream(srcFiles[i]);  
  42.                     System.out.println(path + srcFiles[i].getName());  
  43.                     out.putNextEntry(new ZipEntry(path + srcFiles[i].getName()));  
  44.                     int len;  
  45.                     while((len=in.read(buf))>0){  
  46.                         out.write(buf,0,len);  
  47.                     }  
  48.                     out.closeEntry();  
  49.                     in.close();  
  50.                 }  
  51.             }  
  52.         } catch (Exception e) {  
  53.             e.printStackTrace();  
  54.         }  
  55.     }  


在压缩的时候,针对文件夹进行判断,然后递归压缩文件。





然后是解压:

[java]  view plain copy
  1. /** 
  2.      * 解压到指定目录 
  3.      * @param zipPath 
  4.      * @param descDir 
  5.      * @author isea533 
  6.      */  
  7.     public static void unZipFiles(String zipPath,String descDir)throws IOException{  
  8.         unZipFiles(new File(zipPath), descDir);  
  9.     }  
  10.     /** 
  11.      * 解压文件到指定目录 
  12.      * @param zipFile 
  13.      * @param descDir 
  14.      * @author isea533 
  15.      */  
  16.     @SuppressWarnings("rawtypes")  
  17.     public static void unZipFiles(File zipFile,String descDir)throws IOException{  
  18.         File pathFile = new File(descDir);  
  19.         if(!pathFile.exists()){  
  20.             pathFile.mkdirs();  
  21.         }  
  22.         ZipFile zip = new ZipFile(zipFile);  
  23.         for(Enumeration entries = zip.getEntries();entries.hasMoreElements();){  
  24.             ZipEntry entry = (ZipEntry)entries.nextElement();  
  25.             String zipEntryName = entry.getName();  
  26.             InputStream in = zip.getInputStream(entry);  
  27.             String outPath = (descDir+zipEntryName).replaceAll("\\*""/");;  
  28.             //判断路径是否存在,不存在则创建文件路径  
  29.             File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));  
  30.             if(!file.exists()){  
  31.                 file.mkdirs();  
  32.             }  
  33.             //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压  
  34.             if(new File(outPath).isDirectory()){  
  35.                 continue;  
  36.             }  
  37.             //输出文件路径信息  
  38.             System.out.println(outPath);  
  39.               
  40.             OutputStream out = new FileOutputStream(outPath);  
  41.             byte[] buf1 = new byte[1024];  
  42.             int len;  
  43.             while((len=in.read(buf1))>0){  
  44.                 out.write(buf1,0,len);  
  45.             }  
  46.             in.close();  
  47.             out.close();  
  48.             }  
  49.         System.out.println("******************解压完毕********************");  
  50.     }  

解压的时候,针对文件夹判断创建不存在的文件夹,对文件夹只创建,不进行解压..因为解压是针对文件的,不是文件夹,文件夹需要自己创建。




测试方法:

[java]  view plain copy
  1. public static void main(String[] args) throws IOException {  
  2.         /** 
  3.          * 压缩文件 
  4.          */  
  5.         File[] files = new File[]{new File("d:/English"),new File("d:/发放数据.xls"),new File("d:/中文名称.xls")};  
  6.         File zip = new File("d:/压缩.zip");  
  7.         ZipFiles(zip,"abc",files);  
  8.           
  9.         /** 
  10.          * 解压文件 
  11.          */  
  12.         File zipFile = new File("d:/压缩.zip");  
  13.         String path = "d:/zipfile/";  
  14.         unZipFiles(zipFile, path);  
  15.     }  

测试方法并没有对异常做任何处理,这是不对的,请不要模仿。

输出结果:

[java]  view plain copy
  1. abc/English/templete.xls  
  2. abc/English/中文/csdn/isea/533/abc/templete.xls  
  3. abc/English/中文/csdn/isea/533/abc/zipfile2/templete.xls  
  4. abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/templete.xls  
  5. abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/templete.xls  
  6. abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/领卡清单.xls  
  7. abc/English/中文/csdn/isea/533/abc/zipfile2/领卡清单.xls  
  8. abc/English/中文/csdn/isea/templete.xls  
  9. abc/English/中文/csdn/isea/领卡清单.xls  
  10. abc/English/中文/csdn/templete.xls  
  11. abc/English/领卡清单.xls  
  12. abc/发放数据.xls  
  13. abc/中文名称.xls  
  14. *****************压缩完毕*******************  
  15. d:/zipfile/abc/中文名称.xls  
  16. d:/zipfile/abc/发放数据.xls  
  17. d:/zipfile/abc/English/领卡清单.xls  
  18. d:/zipfile/abc/English/中文/csdn/templete.xls  
  19. d:/zipfile/abc/English/中文/csdn/isea/领卡清单.xls  
  20. d:/zipfile/abc/English/中文/csdn/isea/templete.xls  
  21. d:/zipfile/abc/English/中文/csdn/isea/533/abc/templete.xls  
  22. d:/zipfile/abc/English/templete.xls  
  23. d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/templete.xls  
  24. d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/templete.xls  
  25. d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/templete.xls  
  26. d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/领卡清单.xls  
  27. d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/领卡清单.xls  
  28. ******************解压完毕********************  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值