java通过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();
因此,文件的保存工作正常,但我遇到的问题是,在最后一行,result.getOutputStream().close();
我得到了一个空指针异常
所以我真正简单的问题是:流是否需要我关闭,或者某些方法是否需要关闭它当我删除最后一行时,它仍然会保存文件,并且不会给出任何错误,这一点我很满意,但我不想让任何流保持打开状态
# 1 楼答案
如果你查看source,你会发现这个类只是一个简单的bean,它只有3个字段:
systemId
,outputStream
和writer
加上getter和setter因此,基本上,outputStream或writer只有在有人使用setter或相应的构造函数设置它们时才可用
因为您将
StreamResult
传递到了Transformer
,所以不清楚StreamResult上实际执行了哪些修改,但是我假设如果您没有自己设置它们,那么它们最终将为null,这就是您获得NPE的原因# 2 楼答案
正如您所说的文件构造函数,字节流没有设置。由于类描述和文件构造函数都没有声明您需要手动关闭任何东西,因此可以安全地假设您不需要执行任何操作
编辑:这取决于您应用的转换器,在您的情况下,您使用的是标识(输出=输入)转换器。在我的设置中,这是通过
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl
实现的,它将关闭它打开的任何输出流:(第760-767行)