2012-03-22 120 views
3

我在解压缩使用Java的ZIP文件时遇到了问题。方法如下。使用Java ZipFile解压ZIP文件类

一旦文件解压缩,文件结构就是正确的,这意味着ZIP文件内的目录没问题,但文件输出长度为零。

我检查了ZIP文件,看压缩是否正确,在那里都正确。

,如果有人看到的东西,请我已经错过了......

public static void unzip (File zipfile, File directory) throws IOException { 
    ZipFile zip = new ZipFile (zipfile); 
    Enumeration<? extends ZipEntry> entries = zip.entries(); 

    while (entries.hasMoreElements()) { 
    ZipEntry entry = entries.nextElement(); 
    File file = new File (directory, entry.getName()); 

    if (entry.isDirectory()) { 
     file.mkdirs(); 
    } 
    else { 
     file.getParentFile().mkdirs(); 

     ZipInputStream in = new ZipInputStream (zip.getInputStream (entry)); 
     OutputStream out = new FileOutputStream (file); 
     byte[] buffer = new byte[4096]; 
     int readed = 0; 

     while ((readed = in.read (buffer)) > 0) { 
     out.write (buffer, 0, readed); 
     out.flush(); 
     } 

     out.close(); 
     in.close(); 
    } 
    } 

    zip.close(); 
} 

更多的东西......很显然,方法的getInputStream(项)将返回零个字节,不知道到底为什么。

+0

你有没有尝试过一些调试? in.read()调用是否会返回一些字节? – leonbloy 2012-03-22 20:32:14

+0

请勿在环内冲洗。 – EJP 2016-06-09 03:40:26

回答

2

ZipFile已经解压一个条目的数据,也没有必要使用ZipInputStream

相反的:

ZipInputStream in = new ZipInputStream (zip.getInputStream (entry)); 

用途:

InputStream in = zip.getInputStream (entry); 

ZipInputStream可以用来解压ZIP的文件。你得到零长度数据流的原因是因为使用ZipInputStream你需要调用getNextEntry()来读取ZIP中的第一个文件。

+0

谢谢,的确是这个问题......试图解压缩一个已经解压缩的流。 – 2012-03-23 15:08:43

-1

下面的代码工作:

package so; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.Enumeration; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipFile; 
import java.util.zip.ZipInputStream; 

public class TestZip { 

    public static void main(String[] args) { 
     String path = "C:" + File.separator + "tmp" + File.separator; 
     String nom = "demo.zip"; 
     File zipfile = new File(path + nom); 
     File directory = new File(path); 
     TestZip m = new TestZip(); 
     try { 
      m.unzip(zipfile, directory); 
     } catch (Exception e) { 
      e.printStackTrace(System.out); 
     } 
    } 

    public static void unzip (File zipfile, File directory) throws IOException { 
     System.out.println(zipfile.toString()); 
     System.out.println(directory.toString()); 
      ZipFile zip = new ZipFile ( zipfile); 
      System.out.println("1"); 
      Enumeration<? extends ZipEntry> entries = zip.entries(); 
      System.out.println("2"); 

      while (entries.hasMoreElements()) { 
       System.out.println("3"); 
      ZipEntry entry = entries.nextElement(); 
      File file = new File (directory, entry.getName()); 

      if (entry.isDirectory()) { 
       file.mkdirs(); 
      } 
      else { 
       file.getParentFile().mkdirs(); 

       ZipInputStream in = new ZipInputStream (zip.getInputStream (entry)); 
       OutputStream out = new FileOutputStream (file); 
       byte[] buffer = new byte[4096]; 
       int readed = 0; 

       while ((readed = in.read (buffer)) > 0) { 
       out.write (buffer, 0, readed); 
       out.flush(); 
       } 

       out.close(); 
       in.close(); 
      } 
      } 

      zip.close(); 
     } 


} 

所以我觉得这个问题是你传递的参数。用“new File(complete_path + filename)”创建参数“zipfile”。如果您只是使用文件名创建它不起作用。