谁关闭了从 try with resources 块中返回的“InputStream”?
Who closes an `InputStream` that is Returned from within a try with resources block?
在进行代码审查时,我偶然发现了一些如下所示的代码:
try (InputStream stream = new BufferedInputStream(resource)) {
return stream;
}
其中 resource
是在方法的其他地方定义的。 请注意,这是示例代码,在现实生活中,重要的是 stream
关闭以免泄漏资源。
我的问题是:try with resources 块会代表我关闭 stream
吗?一旦 stream
被 return 发送给调用者,他们可能会尝试用它做一些有用的事情,或者上帝禁止,在一个永远不会被清理的全局变量中保存对它的引用。
try with resources 块是否会遵循此引用并尽职地清理它?我在阅读过的有关此语法的任何教程或文档中都找不到答案。
我的狡猾感觉很刺痛,告诉我最好的办法是将流的内容复制到某个其他对象,然后 return 该对象以确保流已关闭。
如果 Stream 在 try-with 块内返回,它将被关闭。
这个问题已经有人问过,请看这里:
If it safe to return an InputStream from try-with-resource
在进行代码审查时,我偶然发现了一些如下所示的代码:
try (InputStream stream = new BufferedInputStream(resource)) {
return stream;
}
其中 resource
是在方法的其他地方定义的。 请注意,这是示例代码,在现实生活中,重要的是 stream
关闭以免泄漏资源。
我的问题是:try with resources 块会代表我关闭 stream
吗?一旦 stream
被 return 发送给调用者,他们可能会尝试用它做一些有用的事情,或者上帝禁止,在一个永远不会被清理的全局变量中保存对它的引用。
try with resources 块是否会遵循此引用并尽职地清理它?我在阅读过的有关此语法的任何教程或文档中都找不到答案。
我的狡猾感觉很刺痛,告诉我最好的办法是将流的内容复制到某个其他对象,然后 return 该对象以确保流已关闭。
如果 Stream 在 try-with 块内返回,它将被关闭。
这个问题已经有人问过,请看这里:
If it safe to return an InputStream from try-with-resource