我有一个 InputStream ,我正在将它转换为 InputSource 来运行一些Xpath查询。
InputStream
InputSource
我是否可以在创建 InputStream 后立即关闭 InputSource ,或者仅当我不再需要 InputSource 时才关闭?
这是我的密码:
InputStream stream = multipartfile.getInputStream() InputSource source = new InputSource(stream) stream.close() //here Node root = (Node) xpath.evaluate("/", source, XPathConstants.NODE); stream.close() //Or here?
发布于 2016-12-09 13:21:35
在解析器完成工作之前,您不能关闭 InputStream ,否则它无法读取它。但是,如果您查看JavaDoc of InputSource ,甚至不应该显式关闭流,因为解析器应该关闭它:
InputSource对象属于应用程序: SAX解析器绝不能以任何方式修改它(如果需要,它可以修改副本)。但是,字节流和字符流的标准处理都是作为结束解析清理的一部分关闭它们,因此应用程序不应该在将这些流交给解析器之后再尝试重用它们。
但是,如果要确保它已关闭,则应该在解析器完成其工作之后执行。实际上,您应该在一个 finally 块中这样做,以确保即使出现异常情况也能完成,或者您只需使用一个具有资源的try-with块,它将适当地关闭它,如下所示:
finally
try (InputStream stream = multipartfile.getInputStream()) { InputSource source = new InputSource(stream) Node root = (Node) xpath.evaluate("/", source, XPathConstants.NODE); }
发布于 2016-12-09 13:19:53
这叫做 Decorator pattern 。简单地回答是 no ,在使用源对象之前不应该关闭 InputStream ,因为它是在 InputSource 的功能中使用的。
Decorator pattern
如果我们看一下装饰器模式的例子,我们就会明白为什么我们不应该修改作为构造函数参数传递的对象:
abstract class WindowDecorator implements Window { protected Window windowToBeDecorated; // the Window being decorated public WindowDecorator (Window windowToBeDecorated) { this.windowToBeDecorated = windowToBeDecorated; public void draw() {