我有一个数据结构,我希望能够在关闭程序之前写入文件,然后从文件中读取以在下次应用程序启动时重新填充结构。
我的结构是HashMap<String, Object>
。对象非常简单;对于成员变量,它有一个String,以及两个Boolean类型的小型本机数组。这是一个非常简单的应用程序,我不希望一次超过10-15 <key,value>
对。
我一直在尝试使用对象输入/输出流(不成功)。我是否需要使Object类可序列化?
您能否就最佳方法提出任何建议?我只需要朝着正确的方向努力。谢谢!
编辑:嗯,我仍然感到愚蠢,我正在从一张地图写入并阅读另一张地图,然后比较它们以检查我的结果。显然我在比较他们错了。叹息。答案 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机制进行序列化。 HashMap
和String
已经实现了此接口,因此可以成功序列化。
看看Sun自己的Serialization tutorial - 它很短,我认为应该涵盖你所需的一切。 (您应该能够将Map
对象序列化到流中,然后在后续运行中将其读回来。)
如果遇到问题,请尝试使用一些虚拟值序列化一个简单的HashMap<String, String>
。如果这成功了,你就会知道问题在于(以某种方式)你自己的班级'可串行化;或者,如果这不起作用,你可以在将自己的类投入混合之前专注于基本结构。
如果您有任何您自己无法解决的具体问题,请回复。
答案 3 :(得分:0)
是的,如果要将对象写入文件系统,该对象必须实现Serializeable
。 Here是一个可以帮助你的教程。
答案 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();
}
}