2014-09-19 74 views
0

我有以下結構的zip文件:Java的解壓縮程序

MyZip.zip 
|-- FOLDER_1 
| `-- FOLDER_11 
|  |-- file_a 
|  `-- file_b 
|-- FOLDER_2 
| `-- FOLDER_22 
|  `-- file_c 
`-- FOLDER_3 
    `-- FOLDER_33 
     `-- file_d 

我曾嘗試使用這種example但它不與我的拉鍊結構工作。爲了讓這個班級正確解壓我的zip文件,我需要做些什麼?它將創建C:\ outputzip \ FOLDER1 \ FOLDER_11,其中FOLDER_11不是文件夾,而是一個文件名爲FOLDER_11,然後程序中斷。

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.List; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 

public class UnZip { 
    List<String> fileList; 
    private static final String INPUT_ZIP_FILE = "C:\\MyFile.zip"; 
    private static final String OUTPUT_FOLDER = "C:\\outputzip"; 

    public static void main(String[] args) 
    { 
     UnZip unZip = new UnZip(); 
     unZip.unZipIt(INPUT_ZIP_FILE,OUTPUT_FOLDER); 
    } 

    /** 
    * Unzip it 
    * @param zipFile input zip file 
    * @param output zip file output folder 
    */ 
    public void unZipIt(String zipFile, String outputFolder){ 
     byte[] buffer = new byte[1024]; 

     try{ 
      //create output directory is not exists 
      File folder = new File(OUTPUT_FOLDER); 
      if(!folder.exists()){ 
       folder.mkdir(); 
      } 

      //get the zip file content 
      ZipInputStream zis = 
      new ZipInputStream(new FileInputStream(zipFile)); 
      //get the zipped file list entry 
      ZipEntry ze = zis.getNextEntry(); 

      while(ze!=null){ 
       String fileName = ze.getName(); 
       File newFile = new File(outputFolder + File.separator + fileName); 

       System.out.println("file unzip : "+ newFile.getAbsoluteFile()); 

       //create all non exists folders 
       //else you will hit FileNotFoundException for compressed folder 
       new File(newFile.getParent()).mkdirs(); 

       FileOutputStream fos = new FileOutputStream(newFile);    

       int len; 
       while ((len = zis.read(buffer)) > 0) { 
        fos.write(buffer, 0, len); 
       } 

       fos.close(); 
       ze = zis.getNextEntry(); 
      } 

      zis.closeEntry(); 
      zis.close(); 

      System.out.println("Done"); 
     } catch(IOException ex){ 
      ex.printStackTrace(); 
     } 
    }  
} 
+0

問題尋求幫助調試(「**爲什麼不是這個代碼工作的**?」 )必須包含所需的行爲,特定的問題或錯誤以及在問題本身**中重現**所需的最短代碼。沒有**明確問題陳述**的問題對其他讀者沒有用處。請參見[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – DavidPostill 2014-09-19 11:47:31

+0

在問題**中包含您的代碼**(如果鏈接頁面發生變化,問題將會失效)。 – DavidPostill 2014-09-19 11:48:57

+1

如果ZipEntry是目錄,則必須檢查。你將每個條目視爲一個文件。 – drkunibar 2014-09-19 12:44:17

回答

2

更改您的while()循環以下和玩,如果你有一些問題:

 while (ze != null) { 

      String fileName = ze.getName(); 
      File newFile = new File(outputFolder + File.separator 
        + fileName); 

      if (ze.isDirectory()) { 
       File directory = new File(newFile.getPath()); 
       directory.mkdirs(); 
       ze = zis.getNextEntry(); 
       continue; 
      } 

      System.out.println("file unzip : " + newFile.getAbsoluteFile()); 

      FileOutputStream fos = new FileOutputStream(newFile); 

      int len; 
      while ((len = zis.read(buffer)) > 0) { 
       fos.write(buffer, 0, len); 
      } 

      fos.close(); 
      ze = zis.getNextEntry(); 
     } 
+0

或換句話說:ZipEntry可能是隻是一個目錄,並且原始文件將錯誤地輸入到文件中。 – 2014-09-19 12:59:37