[英]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.