如果我有一个使用 IO 资源的类,例如磁盘平面文件、数据库或某种其他形式的外部资源,那么在重写的 Finalize() 方法中关闭这些流/连接的优点和缺点是什么?由GC运行?我认为这可以利用现有的 JVM GC,并减少依赖客户端调用名为 closeResources() 之类的类方法以及编写类似意大利面的 try-catch(嵌套的 try-catch 和 ifs)的风险。我最不喜欢的编程结构)。
作为一个具体示例,我有一个简单的文件读取包装器。该类由 String filePath
构造而成。 ,它将文件读入 List<String[]>
。我不想关闭 BufferedReader
在多个地方,例如,如果打开文件出现问题(catch 子句),则关闭它;如果文件读取正常,则关闭它,等等。我想将它放在一个地方,并确保无论对象何时发生,它始终处于关闭状态获得GC。
这种方法是一个好的实践还是我试图在 Java 范围内为自己提供太高水平的便利?
最佳答案
这不是一个好主意,因为不能保证调用 finalize()
方法。
当您的代码使用完资源后,关闭这些资源会更容易、更好。
如果您讨厌编写嵌套的 try-finally block 来正确关闭资源,请使用类似 commons-io's 的内容。 IOUtils以静默方式关闭资源(或编写您自己的简单 util 方法以静默方式关闭它们):
InputStream stream = ...;
try {
...
}
finally {
IOUtils.closeQuietly(stream);
}
关于java - 在重写的finalize()方法中关闭类IO资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12958440/