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()?
新实例仅由...... new(*)创建.如果您没有看到new那里,则不会创建新实例.
因此,返回不会创建新实例.如果在"执行某些操作"中抛出异常没有任何反应getStream,那么您可能会以适当的方式关闭它.
更好的方法是使用try-with-resources,它可以更彻底地保留异常.
(*)好的,是的,有些特定的情况并不完全正确,例如字符串连接.字符串连接和自动装箱.字符串连接,自动装箱和数组声明.我会再次进来.
但实际上,缺乏new语法糖:在某个地方,一个new被调用.
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |