【问题标题】:Java need help to close StreamJava 需要帮助来关闭 Stream
【发布时间】:2014-02-12 20:56:09
【问题描述】:

我的 DOM 解析器中有一个 DOM 解析器,在写入 XML 文件后,它似乎没有关闭 Streams。

我的程序创建一个文件,并调用此代码(如下所示)将xml-nodes 写入文件。我的程序还包含一个“删除”文件功能,该功能不起作用,因为有一些Streams未关闭Streams,因此删除文件返回false。

当我重新运行程序时,我可以删除文件。但每次我在程序内创建新文件或编辑现有文件时,程序似乎都会留下一些打开的Streams。

以下代码是留下未关闭的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,或者修复打开的Streams 的错误,因为我不确定Stream 是什么未关闭。

【问题讨论】:

  • 您可以将 FileOutputStream 声明为名为 out 的变量,并在完成后调用 out.close()

标签: java xml dom io stream


【解决方案1】:

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

sr.getOutputStream().close()

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

【讨论】:

  • 谢谢,成功了!我知道 StreamResult 不是 Stream,但我认为如果 StreamResult 包含 Stream,Java 会通过 StreamResult 将方法应用于 Stream。没有什么是那么容易的!谢谢:-)!
  • 通常的约定是创建流的代码负责关闭它。关闭不是您创建的流被认为是不礼貌的,即使您已经阅读到它的结尾(尽管有时在创建者没有机会的情况下这是必要的)。但在这种情况下,您创建了流,因此关闭它是您的工作。
  • @MichaelKay 对于任何人来说,简单地将Stream 传递给StreamResult 即可打开流,这并不是很明显。我在 2009 年发现了您对此的评论,看起来对此没有采取任何措施。 java.net/projects/jaxp/lists/eg/archive/2009-03/message/0
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2021-11-12
    • 2014-09-22
    • 2014-08-31
    • 2018-02-15
    相关资源
    最近更新 更多