我有一个InputStream
,我正在将它转换为InputSource
来运行一些Xpath查询。
我是否可以在创建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块,它将适当地关闭它,如下所示:
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
的功能中使用的。
如果我们看一下装饰器模式的例子,我们就会明白为什么我们不应该修改作为构造函数参数传递的对象:
abstract class WindowDecorator implements Window {
protected Window windowToBeDecorated; // the Window being decorated
public WindowDecorator (Window windowToBeDecorated) {
this.windowToBeDecorated = windowToBeDecorated;
}
public void draw() {
windowToBeDecorated.draw(); //Delegation
}
public String getDescription() {
return windowToBeDecorated.getDescription(); //Delegation
}
}
在这个示例中可以看到,windowToBeDecorated
作为对象正在draw()
或getDescription()
方法中使用。
您可以查看有关Decorator模式这里的更多信息。希望一切都清楚。
发布于 2016-12-09 13:20:02
您可以使用try-语句,这可以确保在语句末尾关闭每个资源。在这里您可以找到一个很好的例子:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
https://stackoverflow.com/questions/41061336
复制相似问题