我正在使用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的文件......
答案 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
在字节级读取上执行此操作,计算字节偏移量而不是字符偏移量。这将允许在给定文件大小的情况下进行精确的进度计算。