我正在尝试解析正在编写的 XML 文件。我已经设置了一个 SAX 解析器来为每个元素采取适当的行动。问题是 XML 文件是以块的形式写入的,并且由于缓冲(我认为),SAX 解析器并不总是读取并处理最新的块。这意味着文件中可能有数据在进一步数据到达之前不会得到处理。有没有办法防止这种情况发生并确保 SAX 解析器始终读取可用的最新数据?或者有没有更好的方法来做这个处理?
下面是我用来读取写入的 XML 文件的包装器。尽管我愿意接受建议,但我没有看到在 Java 中执行此操作的更好方法。请注意,当我们开始尝试读取 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();
}
}
}