代码之家  ›  专栏  ›  技术社区  ›  João Simões

我需要关闭reader还是在重写变量时垃圾回收器会关闭它?

  •  0
  • João Simões  · 技术社区  · 7 年前

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

    例如:

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

    i = new ObjectInputStream(new FileInputStream(CONTACTSSAVE));
    addAllContacts((HashSet<String>) i.readObject());
    i = new ObjectInputStream(new FileInputStream(APIKEYSAVE));
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Mark Rotteveel    7 年前

    当有疑问时,总是明确地结束 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
    }
    
        2
  •  0
  •   Mark Rotteveel    7 年前

    vm可能会关闭在 finalize 方法。但还是有必要自己封闭这条河。很难知道什么时候关门。