如何读取和写入文件的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
并从com.fasterxml.jackson导入ObjectMapper并将代码放入try catch块