使用Java ZipFile类解压缩ZIP文件

3
我在使用Java解压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(entry)返回了零字节,不知道具体原因。


你尝试过调试吗?in.read()调用是否返回了一些字节? - leonbloy
不要在循环内部刷新。 - user207421
2个回答

2

ZipFile已经解压了条目的数据,因此没有必要再使用ZipInputStream

应该这样写:

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

使用:

InputStream in = zip.getInputStream ( entry );

ZipInputStream可以用于解压缩ZIP文件。如果你得到的是长度为零的流,那么原因是在使用ZipInputStream时,需要调用getNextEntry()来读取ZIP中的第一个文件。


谢谢,确实那就是问题所在...试图解压已经被解压过的流。 - K-Zen

-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"。如果只是用文件名创建,它不起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接