我正在读取二进制文件,因为我不能序列化我的类,所以我决定分别读取和写入数据结构。
例如:
在我读取第2行代码中的数据后,我需要关闭读取器吗?或者如果我用新的读取器覆盖变量,垃圾收集器会自动处理它吗?
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
方法中未使用的流。但还是有必要自己关闭这条小溪。很难知道它什么时候会关闭。