Java:从磁盘写入/读取映射

时间:2011-01-19 16:55:18

标签: java serialization collections file-io

我有一个数据结构,我希望能够在关闭程序之前写入文件,然后从文件中读取以在下次应用程序启动时重新填充结构。

我的结构是HashMap<String, Object>。对象非常简单;对于成员变量,它有一个String,以及两个Boolean类型的小型本机数组。这是一个非常简单的应用程序,我不希望一次超过10-15 <key,value>对。

我一直在尝试使用对象输入/输出流(不成功)。我是否需要使Object类可序列化?

您能否就最佳方法提出任何建议?我只需要朝着正确的方向努力。谢谢!

编辑:嗯,我仍然感到愚蠢,我正在从一张地图写入并阅读另一张地图,然后比较它们以检查我的结果。显然我在比较他们错了。叹息。

7 个答案:

答案 0 :(得分:33)

如果你不特别关心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);

答案 1 :(得分:2)

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();

答案 2 :(得分:1)

是的,您的对象需要实现Serializable才能通过默认的Java机制进行序列化。 HashMapString已经实现了此接口,因此可以成功序列化。

看看Sun自己的Serialization tutorial - 它很短,我认为应该涵盖你所需的一切。 (您应该能够将Map对象序列化到流中,然后在后续运行中将其读回来。)

如果遇到问题,请尝试使用一些虚拟值序列化一个简单的HashMap<String, String>。如果这成功了,你就会知道问题在于(以某种方式)你自己的班级'可串行化;或者,如果这不起作用,你可以在将自己的类投入混合之前专注于基本结构。

如果您有任何您自己无法解决的具体问题,请回复。

答案 3 :(得分:0)

是的,如果要将对象写入文件系统,该对象必须实现SerializeableHere是一个可以帮助你的教程。

答案 4 :(得分:0)

在了解更多关于它的用途之前,不要费心去制作Serializable。你想看看FileWriter和google“java file io”写这个数据的好方法是CSV。

例如

KEY1,KEY2,KEY3 valuea1,valuea2,valuea3 valueb1,valueb2,valueb3

希望这有帮助。

答案 5 :(得分:0)

我建议不要使用Serializable;比起初看起来要难得多。似乎只需添加implements Serializable就可以了。但事实上,这增加了对代码的许多限制,这些限制在实际软件开发中很难处理(而不是在学校中)。要了解这些限制有多可怕,请参阅Bloch的书Effective Java (second edition)

答案 6 :(得分:-1)

SERIALIZE HASHMAP: 这段代码工作正常,我在我的应用程序中实现和使用。 Plz相应地制作你的功能以保存地图和检索地图。

重要的是,您需要确认您在map中作为值放置的对象必须是可序列化的,这意味着它们应该实现serailizbele接口。恩。 地图&LT; .String,字符串&GT; hashmap = new HashMap&lt; .String,String&gt;()..这一行在这一行... 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();
    }

}