Java 按XML文件的格式解析它';s已写入(无缓冲)
我试图在编写XML文件时解析它。我已经设置了一个SAX解析器,为每个元素采取适当的操作。问题是XML文件是以块的形式编写的,而且由于缓冲(我认为),SAX解析器并不总是读取和处理最新的块。这意味着文件中可能有数据在进一步的数据到达之前不会得到处理。有没有一种方法可以防止这种情况,即确保SAX解析器始终读取可用的最新数据?还是有更好的方法来处理这个问题 下面是我用来在编写XML文件时读取它的包装器。在Java中,我没有看到更好的方法来实现这一点,尽管我愿意接受建议。请注意,当我们开始尝试读取XML文件时,它可能不存在,因此我们可能必须等待在此类中创建它Java 按XML文件的格式解析它';s已写入(无缓冲),java,xml,parsing,sax,Java,Xml,Parsing,Sax,我试图在编写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();
}
}
}
这有什么用?它将监视文件,并在添加每一行时给您一个回调。它将处理等待文件出现和随后的删除。我已经放弃直接使用SAX解析器。InputStream接口不是为这种用途而设计的。无法发出数据已暂时停止到达的信号
相反,我手动读取文件,当我检测到我感兴趣的完整XML实体时,我提取它并将其发送给SAX解析器。这对我来说效果很好。tailer将有助于监视文件,但真正的问题仍然是,SAX解析器在尝试缓冲尚未到达的输入时会停止运行?它应该与流一起工作。