我想从内存列表中提取所有文件,并将它们放在一个列表中,其中每个元素都包含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!
答案 0 :(得分:1)
每个ZipEntry仅在调用getNextEntry()之前保持有效。你必须在调用getNextEntry()之前提取它。
不幸的是,它没有明确记录它的行为方式,我不得不猜测(因为流意味着你只看到所有数据一次),看看getNextEntry()的源代码显示前一个条目在getNextEntry中关闭()。
最好的办法是提取循环中的条目,并围绕byte [](或类似的东西)构建资源。