我的DOM解析器中有一个DOM解析器,在写入Stream
文件之后似乎留下了未关闭的XML
。
我的程序创建一个文件,并调用此代码(如下所示)将xml-nodes
写入文件。我的程序还包含一个“删除”文件函数,该函数不起作用,因为有一些Streams未关闭的Streams,因此删除文件返回false。
当我重新运行程序时,我能够删除该文件..但每次我在程序中创建一个新文件或编辑现有文件时,程序似乎都会留下一些打开的Stream
。
以下代码是留下未公开Stream
的部分。我试图以某种方式关闭Streamresult
,但没有方法可以关闭它。
public void rewriteXML(){
try{
DocumentBuilderFactory song = DocumentBuilderFactory.newInstance();
DocumentBuilder songBuilder = song.newDocumentBuilder();
Document doc = songBuilder.newDocument();
Element playlist = doc.createElement("playlist");
doc.appendChild(playlist);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer tr = tf.newTransformer();
tr.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource dom = new DOMSource(doc);
StreamResult sr = new StreamResult(new FileOutputStream(fileName,false));
tr.transform(dom, sr);
System.out.println("done");
}catch(ParserConfigurationException pce){
pce.printStackTrace();
}catch(TransformerException fce){
fce.printStackTrace();
}catch(IOException ie){
ie.printStackTrace();
}
}
我需要一些方法来关闭Stream
,或者解决开放式Stream
的错误修复方法,因为我不确定Stream
是未闭合的。
答案 0 :(得分:3)
FileOutputStream
是Stream
。 StreamResult
不是Stream
,但包含一个。诀窍是找到它然后关闭它。
sr.getOutputStream().close()
Michael Kay(评论)指出StreamResult
会将传递给它的任何Stream
保留为打开状态。如果您不知道这一点并希望安全,那么值得注意的是,如果您尝试将它们关闭两次,Java中的大多数流都不会抛出异常。如果您不确定,请再次关闭它。
答案 1 :(得分:2)
更好的是,不要自己创建流;让StreamResult
句柄打开和关闭:
StreamResult sr = new StreamResult(new File(fileName));