解析XML文件(无缓冲)

时间:2013-08-05 15:35:14

标签: java xml parsing sax

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

相反,我手动读取文件,当我检测到我感兴趣的已完成的XML实体时,我将其解压缩并将其发送到SAX解析器。这对我来说很好。