我想要流一个包含几个非常大的(~1GByte) XML文件的ZIP文件。我可以将每个压缩文件中的数据读取到一个缓冲区中,并从中创建一个XMLStream --但是为了节省内存,我更愿意动态地处理数据。
@Test
public void zipStreamTest() throws IOException, XMLStreamException {
FileInputStream fis = new FileInputStream("archive.zip");
ZipInputStream zis = new ZipInputStream(fis);
ZipEntry ei;
while ((ei = zis.getNextEntry()) != null){
XMLEventReader xr = XMLInputFactory.newInstance().createXMLEventReader(zis);
while (reader.hasNext()) {
XMLEvent xe = xr.nextEvent();
// do some xml event processing..
}
zis.closeEntry();
}
zis.close();
}问题是:我在执行java.io.IOException: Stream closed时得到了一个zis.closeEntry();。当我删除该行时,同样的错误会抛出在zis.getNextEntry()上,如果前面的条目仍然是自动打开的,它就会关闭它们。
我的XML流读取器似乎正在破坏XML文件末尾的流,以便无法处理zip的其余部分。
我是否有实现错误,还是我对流如何工作的概念不正确?
注意:要使这成为一个最小的可复制示例,您只需要一个zip文件"archive.zip“,它包含任何有效的XML文件(在zip中没有子目录!)。然后可以使用JUnit运行代码段。
发布于 2020-11-22 16:55:38
您可以尝试使用InputStream为每个条目打开单独的java.util.zip.ZipFile。
@Test
public void zipStreamTest() throws Exception {
ZipFile zipFile = new ZipFile("archive.zip");
Iterator<? extends ZipEntry> iterator = zipFile.entries().asIterator();
while (iterator.hasNext()) {
ZipEntry ze = iterator.next();
try (InputStream zis = zipFile.getInputStream(ze)) {
XMLEventReader reader = XMLInputFactory.newInstance().createXMLEventReader(zis);
while (reader.hasNext()) {
XMLEvent xe = reader.nextEvent();
// do some xml event processing
}
reader.close();
}
}
}https://stackoverflow.com/questions/64945635
复制相似问题