我想从列表内存中提取所有文件,并将它们放在列表中,其中每个元素包含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 [](或类似内容)构建资源。