有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java通过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();

因此,文件的保存工作正常,但我遇到的问题是,在最后一行,result.getOutputStream().close();我得到了一个空指针异常

所以我真正简单的问题是:流是否需要我关闭,或者某些方法是否需要关闭它当我删除最后一行时,它仍然会保存文件,并且不会给出任何错误,这一点我很满意,但我不想让任何流保持打开状态


共 (2) 个答案

  1. # 1 楼答案

    如果你查看source,你会发现这个类只是一个简单的bean,它只有3个字段:systemIdoutputStreamwriter加上getter和setter

    因此,基本上,outputStream或writer只有在有人使用setter或相应的构造函数设置它们时才可用

    因为您将StreamResult传递到了Transformer,所以不清楚StreamResult上实际执行了哪些修改,但是我假设如果您没有自己设置它们,那么它们最终将为null,这就是您获得NPE的原因

  2. # 2 楼答案

    public OutputStream getOutputStream()

    Get the byte stream that was set with setOutputStream.

    Returns: The byte stream that was set with setOutputStream, or null if setOutputStream or the ByteStream constructor was not called.

    正如您所说的文件构造函数,字节流没有设置。由于类描述和文件构造函数都没有声明您需要手动关闭任何东西,因此可以安全地假设您不需要执行任何操作

    编辑:这取决于您应用的转换器,在您的情况下,您使用的是标识(输出=输入)转换器。在我的设置中,这是通过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;
        }