在我的代码中,只要需要将FileInputStream
作为参数,我就这样做:
new obj(new FileInputStream(fileLocation));
由于我没有将FileInputStream
分配给任何参考变量,因此我没有使用close()
方法关闭它。
这会导致内存泄漏吗?
上述方式释放的资源不就是FileInputStream
吗?
如果没有引用到你的输入流,它将被垃圾收集,流将自动关闭-参见FileInputStream.finalize()
方法。然而,这不是一个好的编程实践,因为您不知道垃圾收集何时发生。这可能导致内存泄漏。
正确和更安全的方法是在资源块中使用try,或者在旧的java版本中使用try-catch-finally,在finally块中关闭流-我个人喜欢Apache Commons中的IOUtils,您不必关心close()
方法抛出的IOException
一般的答案是否定的。如果你所知道的对象是一个对象,那么你不能假设它会关闭FileInputStream
自己,你应该确保自己处理;Java7中的"使用资源尝试"使这个问题变得微不足道。
try(FileInputStream fileStream =new FileInputStream(fileLocation);){
Obj obj = new Obj(new obj(fileStream));
} catch (IOException ioe) {
//handle exception
}
另一方面,如果您知道该对象实现了AutoClosable
接口,您可以假设当另一个对象关闭时,FileInputStream
也将关闭。
来自Javadocs:
关闭该资源,放弃所有底层资源。这方法管理的对象上自动调用try-with-resources声明。
<>共舞,强调我的