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

时间:2010-07-27 20:07:22

标签: java file file-io hashmap

我有以下 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中的每个元素。 (它只在有数据的地方进入循环)。

谢谢,

5 个答案:

答案 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条目。