要使用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();
这看起来是正常的流程,但我看到一些奇怪的行为。即使在关闭阅读器之后,OS也不允许我删除/移动xml文件,除非我退出java程序。当在Win2k8服务器上运行时,我收到错误消息,指出java.exe正在使用此xml文件。
所以我有几个问题 -
查看@DMLStreamReader的close()文档,我得到以下内容 - “释放与此Reader相关的任何资源。此方法不会关闭基础输入源。”
“基础输入源”是什么意思? 为什么不被读者关闭()?
答案 0 :(得分:10)
文档中提到的基础输入源正是您应该关闭的内容。将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
答案 1 :(得分:1)
"底层输入源"是什么意思?为什么不被读者关闭()?
您通过XMLInputFactory.createXMLStreamReader使用参数InputStream创建了XMLReader。这是一个基础输入源"。 :)因为它在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);
}
}
}