2012-07-25 57 views
0

我正在一個項目中,我有一個hashmap與密鑰作爲Java IO庫中的File對象和一個自定義模型對象,稱爲DrawingModel爲hashmap中的值。當我改變模型時,我需要保存文件。當我經歷的事件順序如下:Java HashMap,其中的關鍵是一個文件,價值是一個模型

  1. 我打開一個文件
  2. 我做一些改變
  3. 我保存的文件(文件 - >保存)
  4. 我退出文件
  5. 然後我打開同一個文件
  6. 但是,它不能打開!

我的問題是如果我改變文件(通過保存)我需要從哈希圖中刪除該鍵值對並添加一個新的鍵值對嗎?這樣的值是相同的,但密鑰更新?

非常感謝您的時間和幫助!

真誠, NC5

回答

1

我建議你把文件名作爲鍵而不是文件對象,並通過另一個邏輯處理文件編輯/更新的東西。 作爲密鑰的文件對象沒有多大意義

+1

這是非常有意義的,儘管我並不完全理解(並因此寬恕)應用程序設計,但在引用文件時應該總是使用'File'實例,爲什麼還要使用'String'並記住它真的是一個文件參考? – 2012-07-25 07:36:18

+0

但是像這種情況一樣關閉/打開流的問題將繼續發生,您將不得不使用其他代碼來處理這些問題。 – 2012-07-25 07:39:19

+0

恐怕我看不出您的觀點與是否相關一個'File'對象用於存儲文件的路徑,而不是'String'。 – 2012-07-25 07:46:02

3

File對象是不是一個包裝的實際文件的路徑而已。它不會以任何方式鎖定您的文件。

鎖定是由一些仍然打開的流引起的。我敢打賭,在保存到文件後,您並未關閉輸出流。

+0

謝謝!我認爲可能是這樣,但我不是100%肯定的。感謝您的確認。 – 2012-07-25 07:32:55

1

是的。如果你從邏輯上思考,你的密鑰就會改變。一旦它被改變,你將無法再使用它來找到你的數據。您應該在地圖中插入一個(新密鑰,值)對。

+0

如果引用文件的內容已更改,則「File」實例不會更改。 – 2012-07-25 07:32:57

+0

是的,特別是'equals()'方法只在'File'實例所指的路徑上計算。 – 2012-07-25 07:33:58

+0

'hashcode()'怎麼樣?我實際上想看'java.io.File'的'hashcode()'方法,但沒有方便的源代碼。 :( – Garbage 2012-07-25 07:36:23

1

始終close()file打開否則文件將不會被更新。它也將更好關閉Connection and Channel streams

1

請確保您已關閉文件流(最上面的一個)。也就是說,如果您已經打開了多個流,請確保最上面的流已關閉。否則,文件將被操作系統鎖定。

相關問題