我正在读取二进制文件,因为无法序列化类,所以我决定分别读取和写入数据结构。
例如:
在第二行代码中读取数据之后,我是否需要关闭读取器,或者如果我用新的读取器覆盖了变量,垃圾收集器会自动处理它吗?
i = new ObjectInputStream(new FileInputStream(CONTACTSSAVE));
addAllContacts((HashSet<String>) i.readObject());
i = new ObjectInputStream(new FileInputStream(APIKEYSAVE));
答案 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
方法中未使用的流。但是仍然需要自己关闭流。很难知道何时关闭。