如何读取和写入文件的HashMap?

我有以下HashMap

HashMap fileObj = new HashMap(); ArrayList cols = new ArrayList(); cols.add("a"); cols.add("b"); cols.add("c"); fileObj.put("mylist",cols); 

我将它写入文件如下:

 File file = new File("temp"); FileOutputStream f = new FileOutputStream(file); ObjectOutputStream s = new ObjectOutputStream(f); s.writeObject(fileObj); s.flush(); 

现在我想将这个文件读回HashMap,其中Object是一个ArrayList。 如果我只是这样做:

 File file = new File("temp"); FileInputStream f = new FileInputStream(file); ObjectInputStream s = new ObjectInputStream(f); fileObj = (HashMap)s.readObject(); s.close(); 

这不会以我保存的格式给出对象。它返回一个包含15个null元素的表和第3个元素的对。 我希望它只返回一个元素,其中包含我首先提供给它的值。
//如何将同一对象读回HashMap?

好基于Cem的说明:这似乎是正确的解释:

ObjectOutputStream以ObjectInputStream将要理解的反序列化的任何格式序列化对象(在本例中为HashMap),并且对任何Serializable对象都是如此。 如果您希望以您希望的格式进行序列化,则应编写自己的序列化器/解串器。

在我的例子中:当我从文件中读回Object并获取数据并用它做任何我想做的事情时,我只是遍历HashMap中的每个元素。 (它只在有数据的地方进入循环)。

谢谢,

您似乎混淆了HashMap的内部解析与HashMap的行为方式。 collections品是一样的。 这是一个简单的测试,以certificate它。

 public static void main(String... args) throws IOException, ClassNotFoundException { HashMap fileObj = new HashMap(); ArrayList cols = new ArrayList(); cols.add("a"); cols.add("b"); cols.add("c"); fileObj.put("mylist", cols); { File file = new File("temp"); FileOutputStream f = new FileOutputStream(file); ObjectOutputStream s = new ObjectOutputStream(f); s.writeObject(fileObj); s.close(); } File file = new File("temp"); FileInputStream f = new FileInputStream(file); ObjectInputStream s = new ObjectInputStream(f); HashMap fileObj2 = (HashMap) s.readObject(); s.close(); Assert.assertEquals(fileObj.hashCode(), fileObj2.hashCode()); Assert.assertEquals(fileObj.toString(), fileObj2.toString()); Assert.assertTrue(fileObj.equals(fileObj2)); } 

我相信你犯了一个常见的错误。 使用后忘了关闭流!

  File file = new File("temp"); FileOutputStream f = new FileOutputStream(file); ObjectOutputStream s = new ObjectOutputStream(f); s.writeObject(fileObj); s.close(); 

你的第一行:

 HashMap fileObj = new HashMap(); 

给了我暂停,因为值不能保证可Serializable ,因此可能无法正确写出。 您应该将对象真正定义为HashMap (或者,如果您愿意,可以简化Map )。

我还会考虑以简单的文本格式(如JSON)序列化Map,因为您正在执行一个简单的String -> List映射。

我相信你得到了你正在拯救的东西。 你保存之前有没有检查过地图? 在HashMap

 /** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 16; 

例如,默认的HashMap将从16个null开始。 您使用其中一个存储桶,因此在保存时只剩下15个null ,这是您加载时获得的。 尝试检查fileObj.keySet() .entrySet().values()以查看您的期望。

HashMap的设计在内存交易时速度很快。 有关更多详细信息,请参阅Wikipedia的哈希表条目。

您还可以使用JSON文件来读写MAP对象。

将地图对象写入JSON文件

  ObjectMapper mapper = new ObjectMapper(); Map map = new HashMap(); map.put("name", "Suson"); map.put("age", 26); // write JSON to a file mapper.writeValue(new File("c:\\myData.json"), map); 

从JSON文件中读取地图对象

  ObjectMapper mapper = new ObjectMapper(); // read JSON from a file Map map = mapper.readValue( new File("c:\\myData.json"), new TypeReference>() { }); System.out.println(map.get("name")); System.out.println(map.get("age")); 

并从com.fasterxml.jackson导入ObjectMapper并将代码放入try catch块