谁关闭了一个带有资源块的try中返回的InputStream?

问题描述

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

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

其中resource方法的其他位置定义。 请注意,这是示例代码,在现实生活中,请务必关闭stream,以免浪费资源

我的问题是:尝试使用资源块会代表我关闭stream吗?将stream返回给调用方后,他们可能会尝试使用它做一些有用的事情,或者禁止使用,将对它的引用保存在一个永不清除的全局变量中。

尝试使用资源块会遵循此参考并妥善清理吗?在我阅读的有关该语法的任何教程或文档中,我都找不到答案。

我的幻想是刺痛,并告诉我最好的方法是将流的内容复制到其他对象,然后返回该对象以确保流已关闭

解决方法

如果流在try-with块内返回,则流将关闭。

该问题已被提出,请参见此处:
If it safe to return an InputStream from try-with-resource