繁体   English   中英

如何跟踪StAX中大文件的解析进度?

[英]How do I keep track of parsing progress of large files in StAX?

我正在使用StAX API处理大型(1TB)XML文件。 假设我们有一个处理某些元素的循环:

XMLInputFactory fac = XMLInputFactory.newInstance();
 XMLStreamReader reader = fac.createXMLStreamReader(new FileReader(inputFile));
   while (true) {
       if (reader.nextTag() == XMLStreamConstants.START_ELEMENT){
            // handle contents
       }
}

如何跟踪大型XML文件中的总体进度? 对于较小的文件,从阅读器获取偏移量效果很好:

int offset = reader.getLocation().getCharacterOffset();

但作为Integer偏移量,它可能仅适用于最大2GB的文件...

一个简单的FilterReader应该可以工作。

class ProgressCounter extends FilterReader {
    long progress = 0;

    @Override
    public long skip(long n) throws IOException {
        progress += n;
        return super.skip(n);
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        int red = super.read(cbuf, off, len);
        progress += red;
        return red;
    }

    @Override
    public int read() throws IOException {
        int red = super.read();
        progress += red;
        return red;
    }

    public ProgressCounter(Reader in) {
        super(in);
    }

    public long getProgress () {
        return progress;
    }
}

似乎Stax API无法为您提供long补偿。

作为一种解决方法,您可以创建一个自定义java.io.FilterReader类,该类重写read()read(char[] cbuf, int off, int len)以增加long偏移量。

您可以将此阅读器传递给XMLInputFactory 然后,处理程序循环可以直接从阅读器获取偏移信息。

您也可以使用FilterInputStream在字节级读取时执行此操作,计算字节偏移量而不是字符偏移量。 给定文件大小,这将允许进行精确的进度计算。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM