Java 按XML文件的格式解析它';s已写入(无缓冲)

Java 按XML文件的格式解析它';s已写入(无缓冲),java,xml,parsing,sax,Java,Xml,Parsing,Sax,我试图在编写XML文件时解析它。我已经设置了一个SAX解析器,为每个元素采取适当的操作。问题是XML文件是以块的形式编写的,而且由于缓冲(我认为),SAX解析器并不总是读取和处理最新的块。这意味着文件中可能有数据在进一步的数据到达之前不会得到处理。有没有一种方法可以防止这种情况,即确保SAX解析器始终读取可用的最新数据?还是有更好的方法来处理这个问题 下面是我用来在编写XML文件时读取它的包装器。在Java中,我没有看到更好的方法来实现这一点,尽管我愿意接受建议。请注意,当我们开始尝试读取XML

我试图在编写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解析器在尝试缓冲尚未到达的输入时会停止运行?它应该与流一起工作。