首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以在创建InputStream之后立即关闭InputSource吗?

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

Stack Overflow用户
提问于 2016-12-09 13:13:43
回答 3查看 1.4K关注 0票数 0

我有一个InputStream,我正在将它转换为InputSource来运行一些Xpath查询。

我是否可以在创建InputStream后立即关闭InputSource,或者仅当我不再需要InputSource时才关闭?

这是我的密码:

代码语言:javascript
运行
复制
InputStream stream = multipartfile.getInputStream()
InputSource source =  new InputSource(stream)
stream.close() //here
Node root = (Node) xpath.evaluate("/", source, XPathConstants.NODE);
stream.close() //Or here?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-09 13:21:35

在解析器完成工作之前,您不能关闭InputStream,否则它无法读取它。但是,如果您查看JavaDoc of InputSource,甚至不应该显式关闭流,因为解析器应该关闭它:

InputSource对象属于应用程序: SAX解析器绝不能以任何方式修改它(如果需要,它可以修改副本)。但是,字节流和字符流的标准处理都是作为结束解析清理的一部分关闭它们,因此应用程序不应该在将这些流交给解析器之后再尝试重用它们。

但是,如果要确保它已关闭,则应该在解析器完成其工作之后执行。实际上,您应该在一个finally块中这样做,以确保即使出现异常情况也能完成,或者您只需使用一个具有资源的try-with块,它将适当地关闭它,如下所示:

代码语言:javascript
运行
复制
try (InputStream stream = multipartfile.getInputStream()) {
    InputSource source =  new InputSource(stream)
    Node root = (Node) xpath.evaluate("/", source, XPathConstants.NODE);
}
票数 1
EN

Stack Overflow用户

发布于 2016-12-09 13:19:53

这叫做Decorator pattern。简单地回答是no,在使用源对象之前不应该关闭InputStream,因为它是在InputSource的功能中使用的。

如果我们看一下装饰器模式的例子,我们就会明白为什么我们不应该修改作为构造函数参数传递的对象:

代码语言:javascript
运行
复制
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模式这里的更多信息。希望一切都清楚。

票数 1
EN

Stack Overflow用户

发布于 2016-12-09 13:20:02

您可以使用try-语句,这可以确保在语句末尾关闭每个资源。在这里您可以找到一个很好的例子:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41061336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档