2012-11-28 17 views
1

所以,我碰到一個鑄鋼問題與存儲HashMap性質的Properties文件,因爲HashMap的關鍵是能不能被轉換爲java.lang.String的對象,因爲屬性必須是(String, String)而我的HashMap(Object, Long)保存HashMap的性能屬性文件,並加載這些屬性回到HashMap的

我只是想將HashMap的內容保存到一個文件中,這樣我就可以在下次運行程序時將這些內容加載回HashMap

我已經經歷了過量的毫無價值的嘗試,試圖用它們保存之前包含的對象來填充HashMaps。我試圖想到一個簡單的方法來將對象轉換爲我可以做的字符串,但由於PropertiesHashMaps未被編入索引,我無法將這些字符串更改回它們需要的對象。如何實現這一目標?

這裏是我想要做的事:

public File savedHashMaps = new File("SavedHashMaps.list"); 
// in my case, the object is 'Location' from an implemented API 
public Map<Location, Long> map = new HashMap<Location, Long>(); 

public void saveMaps() { 
    Properties prop = new Properties(); 
    try { 
     if (!map.isEmpty()) { 
      prop.load(new FileInputStream(savedHashMaps)); 
      prop.putAll(map); 
      prop.store(new FileOutputStream(savedHashMaps), null); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void loadMaps() { 
    Properties prop = new Properties(); 
    try { 
     prop.load(new FileInputStream(savedHashMaps)); 
     if (!prop.isEmpty()) { 
      map.putAll((Map)prop); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

屬性文件不是保存數據的正確方法('Map ')。你應該想出適合你的數據的自己的數據文件格式來保存/檢索。 –

+2

爲了這個目的,使用ObjectInputStream和ObjectOutputStream可能會比使用Properties格式更好,除非您希望另一個程序讀取/寫入它。 – Lee

回答

1

使用的ObjectInput/OutputStream

public File savedHashMaps = new File("SavedHashMaps.list"); 
public Map<Location, Long> map = new HashMap<Location, Long>(); 

public void saveMaps() { 
    try { 
     ObjectOutputStream oos = new ObjectOutputStream (new FileOutputStream(savedHashMaps)); 
     oos.writeObject(map); 
     oos.close(); 
    } catch (Exception e) { 
     // Catch exceptions 
    } 
} 

public void loadMaps() { 
    try { 
     ObjectInputStream ois = new ObjectInputStream(new FileInputStream(savedHashMaps)); 
     Object readMap = ois.readObject(); 
     if(readMap != null && readMap instanceof HashMap) { 
      map.putAll((HashMap) readMap); 
     } 
     ois.close(); 
    } catch (Exception e) { 
     // Catch exceptions 
    } 
} 

這是從內存,很抱歉的錯誤,但是這將保存並重新加載的所有位置,長映射。同樣值得注意的是,Location類必須實現Serializable(或者有一個實現它的超類)(這是一個標記接口(請參閱java.dzone.com/articles/marker-interfaces-java),因此您只需添加implements Serializable)。

+0

如果對象不可序列化,你會怎麼做? –

+0

你將不得不實現你自己的保存/檢索對象的方法。如在XML中。至於實現,這取決於文件的內容。它可能會實現一個使用[Reflection API] [http://docs.oracle.com/javase/tutorial/reflect/index.html],以便您可以保存任何對象,但這是行不通的小程序。 – Lee

+0

我最終創建了一個serializedLocation類,它只是實現了serializable,並處理了標準Location對象和序列化Location對象之間的轉換。我知道它工作得很好!謝謝你的幫助! –