我可以在创建InputSource后立即关闭InputStream吗?

时间:2016-12-09 13:13:43

标签: java xpath inputstream

我有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?

3 个答案:

答案 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