Java解压缩zip

来源:互联网 发布:ping命令测试网络丢包 编辑:程序博客网 时间:2024/06/08 00:07

ava解压缩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. ******************解压完毕********************    




原创粉丝点击