XMLStreamReader 未关闭打开的 xml 文件



要使用XMLStreamReader,我正在初始化它,就像 -

XMLInputFactory f = XMLInputFactory.newInstance();
XMLStreamReader reader = f.createXMLStreamReader(new FileReader(
        "somefile.xml"));

这样迭代它——

if (reader.hasNext()) {
    reader.next();
    // do something with xml data
}

最后像这样关闭它——

reader.close();

这看起来是一个正常的流程,但我看到了一些奇怪的行为。即使在关闭阅读器后,操作系统也不允许我删除/移动 xml 文件,除非我退出 java 程序。在Win2k8服务器上运行时,我收到错误消息,指出java.exe正在使用此xml文件。

所以我有几个问题——

  1. 我是否需要显式关闭每个文件读取器的关闭?
  2. 如何找出哪个 java 代码路径使此文件句柄保持打开状态。

查看@XMLStreamReader的close()的文档,我得到以下 - "释放与此阅读器相关的任何资源。此方法不会关闭基础输入源。

"基础输入源"的含义是什么?为什么没有被读者的close()关闭

文档中提到的底层输入源正是您应该关闭的。将 FileReader 放入局部变量中以便能够关闭它:

XMLInputFactory f = XMLInputFactory.newInstance();
FileReader fr = new FileReader("somefile.xml");
XMLStreamReader reader = f.createXMLStreamReader(fr);
// process xml
reader.close();
fr.close();
//suggest using apache commons IOUtils.closeQuietly(fr); this way you
// don't have to deal with exceptions if you don't want

"基础输入源"的含义是什么?为什么没有被读者的close()关闭

你通过XMLInputFactory.createXMLStreamReader创建了XMLReader,参数为InputStream左右。这是一个"底层输入源"。:)因为它在 XMLReader 之外打开,因此 XMLReader 不会关闭它。但是,如果需要,可以将这个包装类用于 XMLReader。只是工作。

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.util.StreamReaderDelegate;
public class XMLFileReader extends StreamReaderDelegate implements AutoCloseable {
    private final static XMLInputFactory factory = XMLInputFactory.newFactory();
    private final Path file;
    private final InputStream stream;
    private final XMLStreamReader reader;
    public XMLFileReader(Path file) throws IOException, XMLStreamException {
        super();
        this.file = file;
        stream = Files.newInputStream(this.file);
        reader = factory.createXMLStreamReader(stream);
        setParent(reader);
    }
    @Override
    public void close() throws XMLStreamException {
        try {
            super.close();
            stream.close();
        } catch (IOException e) {
            throw new XMLStreamException(file+" : "+e.getMessage(),e);
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新