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

时间:2016-01-11 14:57:26

标签: 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的文件......

2 个答案:

答案 0 :(得分:3)

简单的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;
    }
}

答案 1 :(得分:1)

似乎Stax API无法为您提供long偏移量。

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

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

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

相关问题