Java解壓縮zip - 解壓縮多個文件或文件夾

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. ******************解壓完畢********************    




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章