我有InputStream
我正在转换为InputSource
以运行一些Xpath查询。
我可以在创建InputStream
之后立即关闭InputSource
,还是仅在我不再需要InputSource
时关闭?{/ p>
这是我的代码:
InputStream stream = multipartfile.getInputStream()
InputSource source = new InputSource(stream)
stream.close() //here
Node root = (Node) xpath.evaluate("/", source, XPathConstants.NODE);
stream.close() //Or here?
答案 0 :(得分:1)
这称为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()
方法中使用home
作为对象。
您可以查看有关Decorator模式here的更多信息。希望很清楚。
答案 1 :(得分:1)
在解析器完成工作之前,您不能关闭InputStream
,否则无法读取它。但是如果你看一下InputSource
的JavaDoc,就不应该显式关闭流,因为解析器应该关闭它:
InputSource对象属于应用程序:SAX解析器永远不会以任何方式修改它(如果需要,它可以修改副本)。但是,字节流和字符流的标准处理是在解析结束清理时关闭它们,因此应用程序在将它们传递给解析器后不应尝试重新使用这些流。
但是如果你想确保它已经关闭,你应该在解析器完成工作之后再这样做。实际上你应该在finally
块中执行它以确保即使发生异常也可以完成它,或者你只是使用try-with-resources块来自动关闭它,如:
try (InputStream stream = multipartfile.getInputStream()) {
InputSource source = new InputSource(stream)
Node root = (Node) xpath.evaluate("/", source, XPathConstants.NODE);
}
答案 2 :(得分:0)
您可以使用try-with-resources语句,这可确保在语句结束时关闭每个资源。 在这里你可以找到一个很好的例子:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html