[英]Closing output stream via StreamResult
我正在开发一个Android应用程序,到目前为止一直很好,但是我有一个很小的打嗝让我困扰。
在项目中,我正在使用XML文件,我将它们保存到Android设备的外部存储中。 为此,我使用了TransformerFactory
和StreamResult
对象。
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个字段: systemId
, outputStream
和writer
plus getter和setter。
所以基本上,只有当某人使用setter或相应的构造函数设置它们时,outputStream或writer才可用。
因为你将StreamResult
传递给Transformer
,显然不清楚在StreamResult上实际执行了哪些修改,但我认为如果你没有自己设置它们,那么它们最终会变为null,这就是你得到它的原因NPE。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.