繁体   English   中英

通过StreamResult关闭输出流

[英]Closing output stream via StreamResult

我正在开发一个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();的问题是,在最后一行, result.getOutputStream().close(); 我得到一个Nullpointer异常。

所以我的一个非常简单的问题: 流是否需要由我关闭,或者做一些关闭它的方法? 当我删除最后一行时,它仍然保存文件并且完全没有错误,我很满意,但我不想让任何流打开。

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;
    }

如果你查看源代码 ,你会发现该类只是一个简单的bean,它只有3个字段: systemIdoutputStreamwriter plus getter和setter。

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

因为你将StreamResult传递给Transformer ,显然不清楚在StreamResult上实际执行了哪些修改,但我认为如果你没有自己设置它们,那么它们最终会变为null,这就是你得到它的原因NPE。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM