首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMLEventReader从ZipInputStream关闭流

XMLEventReader从ZipInputStream关闭流
EN

Stack Overflow用户
提问于 2020-11-21 16:53:46
回答 1查看 250关注 0票数 2

我想要流一个包含几个非常大的(~1GByte) XML文件的ZIP文件。我可以将每个压缩文件中的数据读取到一个缓冲区中,并从中创建一个XMLStream --但是为了节省内存,我更愿意动态地处理数据。

代码语言:javascript
复制
@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运行代码段。

EN

回答 1

Stack Overflow用户

发布于 2020-11-22 16:55:38

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

代码语言:javascript
复制
@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();
            }
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64945635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档