通过StreamResult关闭输出流

时间:2015-02-13 09:53:54

标签: java android xml

我正在开发一个Android应用程序,到目前为止一直很好,但是我有一个打扰我的小打嗝。

在项目中,我正在使用XML文件,我将它们保存到Android设备的外部存储中。为此,我使用TransformerFactoryStreamResult对象。

TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer trans = transFactory.newTransformer();
DOMSource xmlSource = new DOMSource(xmlDoc);

StreamResult result = new StreamResult(Environment.getExternalStorageDirectory() + "/file.xml");
trans.transform(xmlSource, result);
result.getOutputStream().close();

因此,文件IS的保存工作,但问题是,在最后一行,result.getOutputStream().close();我得到一个Nullpointer异常。

所以我非常简单的问题:我是否需要关闭流,或者关闭它的某些方法?当我删除最后一行时,它仍会保存文件并且不会错误,我很高兴,但我不想让任何流开放。

2 个答案:

答案 0 :(得分:3)

  

public OutputStream getOutputStream()

     

获取使用setOutputStream设置的字节流。

     

返回:       使用setOutputStream设置的字节流,如果未调用setOutputStream或ByteStream构造函数,则返回null。

在调用文件构造函数时,未设置字节流。由于类描述和文件构造函数都没有说明您需要手动关闭任何内容,因此可以安全地假设您不需要执行任何操作。

编辑:这取决于您正在应用的变压器,在您使用身份(输出=输入)变压器的情况下。在我的设置中,这由com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl实现,它将关闭它打开的任何输出流:(第760-767行)

    // If we create an output stream for the Result, we need to close it after the transformation.
    if (_ostream != null) {
        try {
            _ostream.close();
        }
        catch (IOException e) {}
        _ostream = null;
    }

答案 1 :(得分:0)

如果您查看source,您会发现该类只是一个简单的bean,它只有3个字段:systemIdoutputStream和{{1加上getters和setter。

所以基本上,只有当某人使用setter或相应的构造函数设置它们时,outputStream或writer才可用。

因为您已将writer传递给StreamResult,所以对StreamResult实际执行了哪些修改并不明显,但我认为如果您没有设置他们自己,然后他们最终会成为null,这就是你获得NPE的原因。