2014-09-19 107 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