如何从zip inmemory中提取文件?

时间:2015-02-13 13:11:24

标签: java zip

我想从内存列表中提取所有文件,并将它们放在一个列表中,其中每个元素都包含zip包含文件中的一个:

    List<Resource> extracted = new ArrayList<>();
    UrlResource url = new UrlResource("http://path.to.file.zip");
    ZipInputStream stream = new ZipInputStream(url.getInputStream());
    ZipEntry zipEntry;
    while((zipEntry = stream.getNextEntry()) != null) {
        extracted.add(new InputStreamResource(stream, zipEntry.getName()));
    }

extracted列表将包含多个InputStreamResources,每个列表都包含在zip压缩存档中。这没关系。

问题: 资源中entry/ZipEntry的每个ZipInputStream字段都为空!

((ZipInputStream) extracted.get(0).getInputStream()).getNextEntry(); // == null for all entries!

1 个答案:

答案 0 :(得分:1)

每个ZipEntry仅在调用getNextEntry()之前保持有效。你必须在调用getNextEntry()之前提取它

不幸的是,它没有明确记录它的行为方式,我不得不猜测(因为流意味着你只看到所有数据一次),看看getNextEntry()的源代码显示前一个条目在getNextEntry中关闭()。

最好的办法是提取循环中的条目,并围绕byte [](或类似的东西)构建资源。