如何读取和写入哈希映射到文件?

2022-09-02 13:26:19

我有以下哈希地图

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,其中对象是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 个空元素的表,< mylist,[a,b,c] 在第 3 个元素处>对。我希望它只返回一个元素,其中包含我首先提供给它的值。
如何将同一对象读回哈希映射?

好吧,根据Cem的笔记:这似乎是正确的解释:

ObjectOutputStream 以 ObjectInputStream 可以理解的任何格式序列化对象(在本例中为 HashMap),并对任何可序列化对象进行一般操作。如果您希望它以所需的格式序列化,则应编写自己的序列化程序/反序列化程序。

在我的情况下:当我从文件中读回对象并获取数据并对其执行任何操作时,我只是迭代HashMap中的每个元素。(它仅在有数据的位置进入循环)。

谢谢


答案 1

您似乎混淆了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));
}

答案 2

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

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