如何从内存中的 zip 中提取文件?

How to extract files from zip inmemory?

我想从内存中的列表中提取所有文件,并将它们放在一个列表中,其中每个元素都包含 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 压缩存档中的文件。这个可以。

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

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

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

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

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