xmleventreader关闭流

7uhlpewt  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(391)

我想流式处理一个包含几个非常大(~1gb)的xml文件的zip文件。我可以将每个zip文件中的数据读入一个缓冲区,并从中创建一个xmlstream—但是为了节省内存,我更喜欢动态处理数据。

  1. @Test
  2. public void zipStreamTest() throws IOException, XMLStreamException {
  3. FileInputStream fis = new FileInputStream("archive.zip");
  4. ZipInputStream zis = new ZipInputStream(fis);
  5. ZipEntry ei;
  6. while ((ei = zis.getNextEntry()) != null){
  7. XMLEventReader xr = XMLInputFactory.newInstance().createXMLEventReader(zis);
  8. while (reader.hasNext()) {
  9. XMLEvent xe = xr.nextEvent();
  10. // do some xml event processing..
  11. }
  12. zis.closeEntry();
  13. }
  14. zis.close();
  15. }

问题是:我得到了一个 java.io.IOException: Stream closed 执行时 zis.closeEntry(); . 当我删除那行时,同样的错误也会被抛出 zis.getNextEntry() 如果以前的条目仍然自动打开,则关闭它们。
似乎我的xml流读取器正在破坏xml文件末尾的流,因此无法处理zip的其余部分。
我是否有实现错误,或者我对流如何工作的概念是否不正确?
注意:为了使这个示例具有最小的可复制性,您只需要一个zip文件“archive.zip”,其中包含任何有效的xml文件(zip中没有子目录!)。然后可以使用junit运行代码段。

gab6jxml

gab6jxml1#

我建议使用 ZipFile 而不是 ZipInputStream ,正如亚历山德拉·杜德基纳在回答中所建议的那样。
但是,如果您正在处理数据流,例如下载,因此希望继续使用 ZipInputStream ,你应该把它包起来 CloseShieldInputStream 来自apache commons io1 getNextEntry() 回路:

  1. while ((ei = zis.getNextEntry()) != null) {
  2. XMLEventReader xr = XMLInputFactory.newInstance().createXMLEventReader(new CloseShieldInputStream(zis));
  3. // Process XML here
  4. zis.closeEntry();
  5. }

1) 或您选择的第三方库中的其他类似帮助程序类。

piztneat

piztneat2#

您可以尝试使用为每个条目打开单独的inputstream java.util.zip.ZipFile :

  1. @Test
  2. public void zipStreamTest() throws Exception {
  3. ZipFile zipFile = new ZipFile("archive.zip");
  4. Iterator<? extends ZipEntry> iterator = zipFile.entries().asIterator();
  5. while (iterator.hasNext()) {
  6. ZipEntry ze = iterator.next();
  7. try (InputStream zis = zipFile.getInputStream(ze)) {
  8. XMLEventReader reader = XMLInputFactory.newInstance().createXMLEventReader(zis);
  9. while (reader.hasNext()) {
  10. XMLEvent xe = reader.nextEvent();
  11. // do some xml event processing
  12. }
  13. reader.close();
  14. }
  15. }
  16. }
展开查看全部

相关问题