我正在开发一个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();
我得到一个Nullpointer异常。
所以我非常简单的问题:我是否需要关闭流,或者关闭它的某些方法?当我删除最后一行时,它仍会保存文件并且不会错误,我很高兴,但我不想让任何流开放。
答案 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个字段:systemId
,outputStream
和{{1加上getters和setter。
所以基本上,只有当某人使用setter或相应的构造函数设置它们时,outputStream或writer才可用。
因为您已将writer
传递给StreamResult
,所以对StreamResult实际执行了哪些修改并不明显,但我认为如果您没有设置他们自己,然后他们最终会成为null,这就是你获得NPE的原因。