我有以下 HashMap :
HashMap<String,Object> fileObj = new HashMap<String,Object>();
ArrayList<String> cols = new ArrayList<String>();
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<String,Object>)s.readObject();
s.close();
这不会以我保存的格式给出对象。 它返回一个包含15个null元素的表和&lt; mylist,[a,b,c]&gt;配对第3个元素。我希望它只返回一个元素,其中包含我首先提供给它的值 //如何将同一个对象读回HashMap?
好的基于Cem的说明:这似乎是正确的解释:
ObjectOutputStream以ObjectInputStream将要理解的反序列化格式序列化对象(在本例中为HashMap),并且对任何Serializable对象都是如此。 如果您希望以您希望的格式进行序列化,则应编写自己的序列化器/解串器。
就我而言:当我从文件中读回Object并获取数据并用它做任何我想做的事情时,我只是遍历HashMap中的每个元素。 (它只在有数据的地方进入循环)。
谢谢,
答案 0 :(得分:11)
您似乎将HashMap的内部表示与HashMap的行为混淆。收藏品是一样的。这是一个简单的测试,以证明它。
public static void main(String... args)
throws IOException, ClassNotFoundException {
HashMap<String, Object> fileObj = new HashMap<String, Object>();
ArrayList<String> cols = new ArrayList<String>();
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<String, Object> fileObj2 = (HashMap<String, Object>) s.readObject();
s.close();
Assert.assertEquals(fileObj.hashCode(), fileObj2.hashCode());
Assert.assertEquals(fileObj.toString(), fileObj2.toString());
Assert.assertTrue(fileObj.equals(fileObj2));
}
答案 1 :(得分:3)
我相信你犯了一个常见的错误。你忘了在使用它之后关闭它!
File file = new File("temp");
FileOutputStream f = new FileOutputStream(file);
ObjectOutputStream s = new ObjectOutputStream(f);
s.writeObject(fileObj);
s.close();
答案 2 :(得分:2)
您也可以使用JSON文件来读写MAP对象。
将地图对象写入JSON文件
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = new HashMap<String, Object>();
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<String, Object> map = mapper.readValue(
new File("c:\\myData.json"),
new TypeReference<Map<String, Object>>() {
});
System.out.println(map.get("name"));
System.out.println(map.get("age"));
从com.fasterxml.jackson导入ObjectMapper并将代码放入try catch块
答案 3 :(得分:1)
你的第一行:
HashMap<String,Object> fileObj = new HashMap<String,Object>();
暂停了,因为值不能保证为Serializable
,因此可能无法正确写出。您应该将对象真正定义为HashMap<String, Serializable>
(或者,如果您愿意,可以简化为Map<String, Serializable>
)。
我还会考虑以简单的文本格式(例如JSON)序列化Map,因为您正在进行简单的String -> List<String>
映射。
答案 4 :(得分:1)
我相信你得到了你正在拯救的东西。你保存之前有没有检查过地图?在HashMap
:
/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 16;
e.g。默认HashMap
将从16 null
开始。您使用其中一个存储桶,因此在保存时只剩下15 null
,这是您加载时获得的。
请尝试检查fileObj.keySet()
,.entrySet()
或.values()
,看看您的期望。
HashMap
被设计为在记忆中交易时速度很快。有关详细信息,请参阅Wikipedia's Hash table条目。