首页 > 解决方案 > 谁关闭了从 try with resources 块中返回的“InputStream”?

问题描述

在进行代码审查时,我偶然发现了一些看起来像这样的代码:

try (InputStream stream = new BufferedInputStream(resource)) {
    return stream;
}

其中resource在方法的其他地方定义。请注意,这是示例代码,在现实生活中,重要的stream是关闭以免泄漏资源

我的问题是:资源尝试会stream代表我关闭吗?一旦stream返回给调用者,他们可能会尝试用它做一些有用的事情,或者上帝保佑,在一个永远不会被清理的全局变量中保存对它的引用。

资源块的尝试是否会遵循此参考并尽职尽责地清理它?在我读过的有关此语法的任何教程或文档中,我都找不到答案。

我的蜘蛛侠感觉很刺痛,告诉我最好的办法是将流的内容复制到其他对象,然后返回该对象以确保流已关闭。

标签: javascopetry-catchtry-with-resources

解决方案


如果 Stream 在 try-with 块内返回,它将被关闭。

已经问过这个问题,请参见此处:
如果从 try-with-resource 返回 InputStream 是安全的


推荐阅读