说我有以下功能
public static void myfunc(String filename) {
new FileInputStream(filename);
}
当我调用该函数时,是否会因为 FileInputStream 从未释放而导致资源泄漏?
以及将来的参考,有没有一种方法可以在调用函数后验证资源没有被释放?
说我有以下功能
public static void myfunc(String filename) {
new FileInputStream(filename);
}
当我调用该函数时,是否会因为 FileInputStream 从未释放而导致资源泄漏?
以及将来的参考,有没有一种方法可以在调用函数后验证资源没有被释放?
是的,存在资源泄漏。大多数 IDE(例如 Eclipse)会发出警告以表明这一点。您可能应该按照以下方式执行以下操作:
public static void myfunc(String filename) throws IOException {
FileInputStream stream = null;
try {
stream = new FileInputStream(filename);
...
} finally {
stream.close();
}
}
或者,如果您使用的是 Java 7,则可以使用try-with-resource语句。
是的,会有资源泄漏。FileInputStream 应始终关闭。
当 GC 运行时,finalize()
应该调用该方法并且此时将关闭流,但您不应该依赖它。
检查是否存在资源泄漏的方法是阅读 javadoc,它对此进行了解释。基本上,所有实现 Closeable 接口的类都应该显式关闭。
你明白这个函数没有做任何有用的事情,对吧?它不会将 FileInputStream 返回给调用者或对其进行任何操作。
通常,您会确保使用 try/finally 块关闭您的流:
InputStream input = null ;
try {
input = new FileInputStream(name);
[read and process input]
} finally {
if (input != null) {
input.close();
}
}