我覆盖变量时需要关闭阅读器还是将垃圾回收器关闭?

时间:2018-08-04 12:38:57

标签: java reader

我正在读取二进制文件,因为无法序列化类,所以我决定分别读取和写入数据结构。

例如:

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

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

2 个答案:

答案 0 :(得分:2)

如有疑问,请始终明确关闭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
}

答案 1 :(得分:0)

虚拟机可能会关闭finalize方法中未使用的流。但是仍然需要自己关闭流。很难知道何时关闭。