我是否需要关闭 reader 或者当我覆盖变量时垃圾收集器会关闭它?

Do I need to close reader or will garbage collector close it when I overwrite the variable?

我正在读取二进制文件,因为我无法序列化我的 class 我决定单独读取和写入数据结构。

例如:

在我读取第 2 行代码的数据后,我是否需要关闭 reader 或者如果我用新的 reader 覆盖变量,垃圾收集器会处理它吗自动地?

i = new ObjectInputStream(new FileInputStream(CONTACTSSAVE));
addAllContacts((HashSet<String>) i.readObject());
i = new ObjectInputStream(new FileInputStream(APIKEYSAVE));

如有疑问,请始终明确关闭 AutoCloseable/Closeable 资源,例如输入流、输出流、套接字、数据库连接等

当您依赖垃圾收集器为您处理时,文件(或其他资源)可能会保持打开状态很长时间(甚至可能直到 Java 退出)。这意味着您不必要地保持资源和内存打开,这可能会影响性能,或者可能会阻碍其他应用程序(或应用程序的其他部分),例如,如果它们需要独占访问权限来覆盖文件。

这对于输出流来说更糟,因为无法关闭流可能 - 例如 - 意味着并非所有更改都已写入磁盘,如果 Java 作为终结器退出,这可能会导致数据丢失不能保证在退出时 运行,因此关闭可能会突然而不是正常地刷新缓冲区。

如果您使用 try-with-resources 来执行此操作,您甚至可以获得额外的好处,即您不会意外泄漏资源,例如,您的代码将变为:

try (ObjectInputStream contacts = new ObjectInputStream(new FileInputStream(CONTACTSSAVE))) {
   addAllContacts((HashSet<String>) contacts.readObject());
}

try (ObjectInputStream apikey = new ObjectInputStream(new FileInputStream(APIKEYSAVE))) {
    // load things from apikey
}

vm 可能会关闭未在 finalize 方法中使用的流。但是还是需要自己关闭流。很难知道什么时候关闭。