簡體   English   中英

覆蓋變量時,我需要關閉閱讀器還是垃圾回收器將其關閉?

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

我正在讀取二進制文件,因為無法序列化類,所以我決定分別讀取和寫入數據結構。

例如:

讀取第二行代碼中的數據后,是否需要關閉閱讀器,或者如果我用新的閱讀器覆蓋變量,則垃圾收集器會自動處理它嗎?

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方法中未使用的流。 但是仍然需要自己關閉流。 很難知道何時關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM