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

lis*_*sam 17 java file-io file 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);  
Run Code Online (Sandbox Code Playgroud)

我将它写入文件如下:

File file = new File("temp");  
FileOutputStream f = new FileOutputStream(file);  
ObjectOutputStream s = new ObjectOutputStream(f);          
s.writeObject(fileObj);
s.flush();
Run Code Online (Sandbox Code Playgroud)

现在我想将此文件读回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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

谢谢,

Pet*_*rey 13

您似乎混淆了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));
}
Run Code Online (Sandbox Code Playgroud)


Hba*_*bas 3

我相信你\xc2\xb4正在犯一个常见的错误。您使用后忘记关闭流!

\n\n
 File file = new File("temp");  \n FileOutputStream f = new FileOutputStream(file);  \n ObjectOutputStream s = new ObjectOutputStream(f);          \n s.writeObject(fileObj);\n s.close();\n
Run Code Online (Sandbox Code Playgroud)\n