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

标签 java xml 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();

但作为整数偏移量,它可能只适用于最大 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;
    }
}

关于java - 如何在 StAX 中跟踪大文件的解析进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34724494/

相关文章:

c# - 用于显示乐谱的库

java - 使用 Java 转换 XML

java - 使用 javax 包装器的 XML 自定义 StAX 解析器

xml-parsing - 使用 StAXResult 调用 Transformer 时省略 XML 声明

java - 哪个是更好的选择 - 与选择操作一起更新 MySQL 表或通过单独的更新方法

java - GWT 2.5.1 CellTable 和 SimplePager 问题

java - 使用 Micrometer 设置 InfluxDB 指标的常见标签

java - Tomcat 错误 : The markup in the document following the root element must be well-formed

java - StAX - XMLEventReader 意外行为

java - 当两个线程试图将相同的键值放入并发 HashMap 中时会发生什么