0

我正在尝试解析正在编写的 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();
        }
    }
}
4

2 回答 2

0

Apache Commons Tailer有用吗?它会监视文件并在添加每一行时给你一个回调。它将处理等待文件出现和随后的删除。

于 2013-08-05T15:40:45.997 回答
0

我已经放弃了直接使用 SAX 解析器。InputStream 接口不是为这种用途而设计的。没有办法表明数据已暂时停止到达。

相反,我手动读取该文件,当我检测到一个我感兴趣的完整 XML 实体时,我将其提取出来并将其发送到 SAX 解析器。这对我的目的来说很好。

于 2013-08-06T15:07:03.800 回答