7

我遇到了java.util.zip.*的奇怪行为

我有一个 zip 文件,解压后会发生以下情况

ZipFile zipfile = new ZipFile(file, ZipFile.OPEN_READ);

这是确切的错误消息

java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:127)
at java.util.zip.ZipFile.<init>(ZipFile.java:143)
at com.basware.ExtractZip.unpack(ExtractZip.java:27)
at com.basware.ExtractZip.main(ExtractZip.java:17)

但是,如果我使用以下代码,它可以打开存档而不会出现任何错误

try {
     BufferedOutputStream dest = null;       
     File file = new File("File_Path");        
     FileInputStream fis = new FileInputStream(file);
     ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
     ZipEntry entry;
     while((entry = zis.getNextEntry()) != null) {
        System.out.println("Extracting: " +entry);
        int count;
        byte data[] = new byte[BUFFER];
        // write the files to the disk
        FileOutputStream fos = new 
      FileOutputStream(entry.getName());
        dest = new 
          BufferedOutputStream(fos, BUFFER);
        while ((count = zis.read(data, 0, BUFFER)) 
          != -1) {
           dest.write(data, 0, count);
        }
        dest.flush();
        dest.close();
     }
     zis.close();

请注意,文件是使用 WinZIP 压缩的。

我的问题是由于 ZipFile 和 ZipInputStream 几乎相同,为什么 ZipFile 会给出异常以及为什么它无法执行解压缩。

编辑:问题是如果我使用 WinZip 工具压缩文件,然后使用列出的程序解压缩它,它工作正常。但是,这个问题专门针对来自外部来源的档案(外部来源声称他们正在使用 WinZip)。最重要的是,如果我使用 WinZip 工具打开相同的存档(外部存档),它会显示和解压缩文件。但是这个 JAVA 特定代码(ZipFile)根本不起作用。

编辑:我无法弄清楚为什么 java 本机代码不适用于我的 ZIP 档案,但 apache compress 解决了我的问题。它按照 Ian Roberts 的建议为我工作。

4

2 回答 2

4

ZipFile尝试解析 zip 末尾的“中央目录”,以构建允许您按名称访问各个条目的数据结构。ZipInputStream没有,它只查看每个条目的本地标题,因为它从上到下读取文件。因此,看起来您的文件具有良好的条目,但由于某种原因,中央目录已损坏。

有很多可能性,例如条目名称中非 ASCII 字符的编码问题,或者 zip 包含超过 64k 的条目。我会尝试 ZipFile 的commons-compress实现——即使它不起作用,它也应该给你一个比你从 java.util.zip 得到的“有问题”更具体的错误消息。

于 2012-12-10T09:20:03.853 回答
0

除了 Ian Robert 的回答,如果 Java 7 是一个选项,您可能希望回避旧java.util.zip库,转而使用ZIP 文件系统提供程序

于 2012-12-10T13:21:53.650 回答