我有一个要转换为InputStreamInputSource以运行一些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?

最佳答案

在解析器完成工作之前,您不得关闭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);
}

10-07 23:28