gpt4 book ai didi

java - Streams 可以通过返回的方法关闭吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:19:50 24 4
gpt4 key购买 nike

我正在使用将 InputStream 打开到文件的遗留代码,我很好奇流是否正确关闭。我们目前拥有的是一种返回 InputStream 的方法,该方法由稍后关闭它的单独方法调用:

public void doThing(String path) throws Exception {

InputStream is = getStream(path);

try {
... // Do some stuff
} finally {
if(is != null)
is.close();
}
}

public InputStream getStream(String path) throws Exception {

InputStream is = new FileInputStream(new File(path));
... // Do some stuff
return is;
}

但我不确定是否可以调用 doThing()正确关闭 InputStream 的所有实例 is .我了解在 doThing() 内方法,InputStream 的实例由 getStream() 返回, 并由 finally 正确关闭堵塞。这部分很清楚。

我不确定的是 getStream() 是否存在方法生成一个未正确关闭的 InputStream 的新实例。

也就是当getStream()返回,它是否返回对原始对象的引用 is ,还是它返回 is新实例具有相同的值(value)?

如果是前者,那么我相信 doThing()方法将关闭文件的所有流。如果是后者,那么我担心我可能创建了另一个从未明确关闭的流。相反,对象只会被垃圾收集器标记为删除,垃圾收集器最终可能会也可能不会删除它。我想避免这种情况。

都是is的实例在 doThing() 结束时关闭?

最佳答案

新实例仅由... new (*) 创建。如果您在那里没有看到 new,则表示没有创建新实例。

因此,返回不会创建新实例。如果在 getStream 中的“do some stuff”中没有发生任何引发异常的事情,那么您将以一种可能足够的方式关闭它。

更好的方法是使用 try-with-resources,它可以更彻底地保留异常。


(*) 好的,是的,在某些特定情况下这并不完全正确,例如字符串连接。字符串连接和自动装箱。字符串连接、自动装箱和数组声明。我会再来的。

但实际上,缺少 new 是语法糖:在某处调用了 new

关于java - Streams 可以通过返回的方法关闭吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com