我想从列表内存中提取所有文件,并将它们放在列表中,其中每个元素包含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,每个entry/ZipEntry用于zip压缩存档中包含的文件。还行吧。

问题:
资源中ZipInputStream的每个字段均为空!

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

最佳答案

在您调用getNextEntry()之前,每个ZipEntry都保持有效。您必须在调用getNextEntry()之前解压缩它。

不幸的是,它的行为方式并没有得到明确的证明,我不得不猜测(因为流意味着您只能看到一次所有数据),并且查看getNextEntry()的源代码会发现前一个条目已在getNextEntry()中关闭。

最好的选择是在循环中提取条目,并围绕byte [](或类似内容)构建资源。

10-01 13:54