簡體   English   中英

Java:從磁盤寫入/讀取映射

[英]Java: Writing/Reading a Map from disk

我有一個數據結構,我希望能夠在關閉程序之前寫入文件,然后從文件中讀取以在下次應用程序啟動時重新填充結構。

我的結構是HashMap<String, Object> 對象非常簡單; 對於成員變量,它有一個String,以及兩個Boolean類型的小型本機數組。 這是一個非常簡單的應用程序,我不希望一次超過10-15個<key,value>對。

我一直在使用Object輸入/輸出流進行實驗(不成功)。 我是否需要使Object類可序列化?

你能給我任何關於最佳方法的建議嗎? 我只需要朝着正確的方向努力。 謝謝!

編輯:嗯,我仍然感到愚蠢,我正在從一張地圖寫入並閱讀另一張地圖,然后比較它們以檢查我的結果。 顯然我在比較他們錯了。 嘆。

如果你不特別關注Object,你只需要對String,String的鍵值對,那么我建議你去java.util.Properties 否則你去吧

        Map map = new HashMap();
        map.put("1",new Integer(1));
        map.put("2",new Integer(2));
        map.put("3",new Integer(3));
        FileOutputStream fos = new FileOutputStream("map.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(map);
        oos.close();

        FileInputStream fis = new FileInputStream("map.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Map anotherMap = (Map) ois.readObject();
        ois.close();

        System.out.println(anotherMap);
Map m = new HashMap();
// let's use untyped and autoboxing just for example
m.put("One",1);
m.put("Two",2);

ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("foo.ser")
);
oos.writeObject(m);
oos.flush();
oos.close();

是的,您的對象需要實現Serializable才能通過默認的Java機制進行序列化。 HashMapString已經實現了這個接口,因此可以成功序列化。

看一下Sun自己的序列化教程 - 它很簡短,我認為應該涵蓋簡單案例所需的一切。 (您應該只能將Map對象序列化為流,然后在后續運行中將其讀回)。

如果遇到問題,請嘗試使用一些虛擬值序列化一個簡單的HashMap<String, String> 如果這成功了,你就會知道問題在於(以某種方式)你自己的班級'可串行化; 或者,如果這不起作用,您可以在將自己的類投入混合之前關注基本結構。

如果您有任何您自己無法解決的具體問題,請回發。

是的,如果要將對象寫入文件系統,則該對象必須實現Serializeable 是一個應該幫助你的教程。

在了解更多關於它的用途之前,不要費心去制作Serializable。 你想看看FileWriter和google“java file io”寫這個數據的好方法是CSV。

例如。

key1,key2,key3 valuea1,valuea2,valuea3 valueb1,valueb2,valueb3

希望這可以幫助。

我建議不要使用Serializable ; 比起初看起來要難得多。 似乎只需添加implements Serializable就可以了。 但事實上,這增加了對代碼的許多限制,這些限制在實際軟件開發中很難處理(而不是在學校中)。 要了解這些限制有多可怕,請參閱Bloch的Effective Java(第二版)一書。

SERIALIZE HASHMAP:這段代碼工作正常,我在我的應用程序中實現並使用。 Plz相應地制作你的功能以保存地圖和檢索地圖。

不好的是,您需要確認您在map中作為值放置的對象必須是可序列化的,這意味着它們應該實現serailizbele接口。 恩。 Map <.String,String> hashmap = new HashMap <.String,String>()..這一行在這一行... map和string都是可隱式序列化的,所以我們不需要為這些明確地實現serializble但是如果你把你自己的對象必須是可序列化的。


public static void main(String arr[])
{
  Map<String,String> hashmap=new HashMap<String,String>();
 hashmap.put("key1","value1");
    hashmap.put("key2","value2");
    hashmap.put("key3","value3");
    hashmap.put("key4","value4");

     FileOutputStream fos;
    try {
        fos = new FileOutputStream("c://list.ser");

    ObjectOutputStream oos = new ObjectOutputStream(fos);
     oos.writeObject(hashmap);
     oos.close();

     FileInputStream fis = new FileInputStream("c://list.ser");
     ObjectInputStream ois = new ObjectInputStream(fis);
    Map<String,String> anotherList = (Map<String,String>) ois.readObject();

     ois.close();

     System.out.println(anotherList);

 } catch (FileNotFoundException e) {e.printStackTrace();
 } catch (IOException e) {e.printStackTrace();
    } catch (ClassNotFoundException e) {e.printStackTrace();
    }

}

暫無
暫無

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

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