Java需要帮助才能关闭Stream

时间:2014-02-12 20:56:09

标签: java xml dom io stream

我的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是未闭合的。

2 个答案:

答案 0 :(得分:3)

FileOutputStreamStreamStreamResult不是Stream,但包含一个。诀窍是找到它然后关闭它。

sr.getOutputStream().close()

Michael Kay(评论)指出StreamResult会将传递给它的任何Stream保留为打开状态。如果您不知道这一点并希望安全,那么值得注意的是,如果您尝试将它们关闭两次,Java中的大多数流都不会抛出异常。如果您不确定,请再次关闭它。

答案 1 :(得分:2)

更好的是,不要自己创建流;让StreamResult句柄打开和关闭:

StreamResult sr = new StreamResult(new File(fileName));