java - 在重写的finalize()方法中关闭类IO资源

标签 java garbage-collection

如果我有一个使用 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/

相关文章:

java - 试图理解以下语句的完整含义 Stream.of(bufferedReader.readLine().replaceAll ("\\s$", "")

java - 错误: Could not find or load main class SOAPTester

java - 为什么 requestFocusInWindow() 会失败?

java - 使用两个 android 微调器,一个依赖于另一个

javascript - 理解这个 JS WeakRef polyfill 实现

python - 在 Python 中使用 <128KB 的字符串时内存泄漏?

java - 针对少量和长时间 GC 运行的 JVM 调优

java - DITA 打开工具包错误 : java. lang.StackOverflowError

java - 如果老年代的对象需要引用年轻代的对象怎么办?

java - 哪个 JVM Flag 设置了 G1Ergonomics 日志中提到的 GC 开销阈值?