Java NIO ZipFileSystem:创建文件系统时“找不到zip END头”

时间:2016-05-24 12:19:45

标签: java zip nio zipfile

我在这里问这个问题因为谷歌搜索这个错误只能让我写一个zip文件,而我只是想读它。
我有一个单元测试,我正在尝试测试以下生产代码:

Map<String, String> zipProps = new HashMap<>();
URI zipUri = URI.create("jar:file:" + itemZipPath.toString());
try (FileSystem zipfiles = FileSystems.newFileSystem(zipUri, zipProps)) {
   // do stuff...
} catch (IOException e) {
   // log an error
}

但是在包含try:

的行上失败了
java.util.zip.ZipError: zip END header not found
at com.sun.nio.zipfs.ZipFileSystem.zerror(ZipFileSystem.java:1605)
at com.sun.nio.zipfs.ZipFileSystem.findEND(ZipFileSystem.java:1021)
at com.sun.nio.zipfs.ZipFileSystem.initCEN(ZipFileSystem.java:1030)
at com.sun.nio.zipfs.ZipFileSystem.<init>(ZipFileSystem.java:130)
at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:117)
at java.nio.file.FileSystems.newFileSystem(FileSystems.java:326)
at java.nio.file.FileSystems.newFileSystem(FileSystems.java:276)
at com.company.PageCommandHandler$ProvisioningSteps.getItemModel(PageCommandHandler.java:105)

我尝试使用OSX的zip实用程序和使用jar cvf来创建zip文件,但两者都失败了(但file <filename>的输出略有不同)。 我能找到的有关此错误的所有信息都与使用Java NIO创建zipfile有关,但正如您所看到的,我只是在进行读取(现在验证ZIP中是否存在某个文件)。 对这里出了什么问题的想法?

3 个答案:

答案 0 :(得分:2)

我遇到了完全相同的错误。 Java 8.原因是,我错误地创建了一个空文件,而不仅仅是对象:

File zipFile = new File(path);
zipFile.createNewFile();

然后将此路径传递给

URI uri = URI.create("jar:file:" + zipFile.getAbsolutePath());

要修复它,我没有自己创建文件,只创建了一个File对象:

File zipFile = new File(path);
URI uri = URI.create("jar:file:" + zipFile.getAbsolutePath());

为了使其更可靠,我建议首先删除文件:

File zipFile = new File(path);
//Caused by: java.util.zip.ZipError: zip END header not found
if (zipFile.exists()){
    try {
        Files.delete(Paths.get(zipFile.getAbsolutePath()));
    } catch (IOException e) {
        throw new IllegalStateException(
                "Could not delete file.", e);
    }
}
...
URI uri = URI.create("jar:file:" + zipFile.getAbsolutePath());

可能在某些情况下,删除文件的解决方案是不可接受的。例如,如果您向同一个zip文件添加几个条目。但在我的用例中没关系。

答案 1 :(得分:0)

我尝试使用普通的ZipInputStream和相关的类,但一直有问题,所以问题似乎与NIO无关。 我的一位同事在SO上发现了这个问题:Extracting zipped file from ResourceStream throws error "Invalid stored block lengths"

所以我尝试将此代码段添加到我的pom.xml中:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];

在此之后,所有问题都消失了,我的所有测试都变成了绿色。我没有回到NIO,因为我很高兴能够找到一个有效的解决方案,但我很确定这也能解决NIO上的问题。

发布在这里,希望有一天能帮助某些人有同样的问题。

答案 2 :(得分:-1)

也许您没有使用ZipInputStream类? 第326行是什么?

以下是解压缩和解压缩zip文件的示例。 http://www.oracle.com/technetwork/articles/java/compress-1565076.html

FileInputStream fis = new FileInputStream(&#34; figs.zip&#34;); ZipInputStream zin = new ZipInputStream(new BufferedInputStream(fis));

打开ZIP输入流后,您可以使用返回ZipEntry对象的getNextEntry方法读取zip条目。如果到达文件结尾,则getNextEntry返回null: