Streams可以通过他们返回的方法关闭吗?

Lor*_*aad 3 java resources stream

我正在使用遗留代码打开一个文件的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;
}
Run Code Online (Sandbox Code Playgroud)

但我不确定是否doThing()正确关闭InputStream的所有实例is.我理解在该doThing()方法中,InputStream的实例getStream()finally块返回,并由块正确关闭.那部分很清楚.

我不确定的是该getStream()方法是否会产生一个未正确关闭的InputStream的新实例.

也就是说,当getStream()返回时,被它返回一个引用原始对象is,或者是它返回一个新的实例is使用相同的价值呢?

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

是否所有实例都is在最后关闭doThing()

And*_*ner 7

新实例仅由...... new(*)创建.如果您没有看到new那里,则不会创建新实例.

因此,返回不会创建新实例.如果在"执行某些操作"中抛出异常没有任何反应getStream,那么您可能会以适当的方式关闭它.

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


(*)好的,是的,有些特定的情况并不完全正确,例如字符串连接.字符串连接和自动装箱.字符串连接,自动装箱和数组声明.我会再次进来.

但实际上,缺乏new语法糖:在某个地方,一个new被调用.