我正在尝试解析正在编写的XML文件。我已经设置了一个SAX解析器来为每个元素采取适当的操作。问题是XML文件是用块编写的,并且由于缓冲(我认为),SAX解析器并不总是读取并处理最新的块。这意味着在进一步的数据到达之前,文件中可能存在未经处理的数据。有没有办法防止这种情况确保SAX解析器始终读取可用的最新数据?或者有更好的方法来进行此处理吗?
下面是我用来读取XML文件的包装器。我没有看到在Java中更好的方法,尽管我愿意接受建议。请注意,当我们开始尝试读取XML文件时,XML文件可能不存在,因此我们可能必须等待在此类中创建它。
public class XmlFileInputStream extends InputStream {
private final File xmlFile;
private InputStream stream;
private boolean done;
private static final int POLL_INTERVAL = 100;
public XmlFileInputStream(File xmlFile) {
this.xmlFile = xmlFile;
this.stream = null;
this.done = false;
}
@Override
public int read() throws IOException {
if (!getStream()) {
return -1;
}
int c;
try {
while ((c = stream.read()) == -1 && !done) {
Thread.sleep(POLL_INTERVAL);
}
} catch (InterruptedException e) {
return -1;
}
return c;
}
private boolean getStream() throws FileNotFoundException {
if (stream == null) {
try {
while (!xmlFile.exists() && !done) {
Thread.sleep(POLL_INTERVAL);
}
} catch (InterruptedException e) {
return false;
}
try {
stream = new new FileInputStream(xmlFile);
} catch (FileNotFoundException e) {
// File deleted before we could open it
return false;
}
}
return true;
}
public void done() {
this.done = true;
}
@Override
public void close() throws IOException {
if (stream != null) {
stream.close();
}
}
}
答案 0 :(得分:0)
Apache Commons Tailer是否有用?它会监视文件,并在添加每一行时给你一个回调。它将处理等待文件出现和后续删除的问题。
答案 1 :(得分:0)
我已经放弃了直接使用SAX解析器。 InputStream接口不是为这种用途而设计的。没有办法发出数据暂时停止到达的信号。
相反,我手动读取文件,当我检测到我感兴趣的已完成的XML实体时,我将其解压缩并将其发送到SAX解析器。这对我来说很好。