Java:从磁盘写入/读取地图

Java:从磁盘写入/读取地图,java,serialization,collections,file-io,Java,Serialization,Collections,File Io,我有一个数据结构,我希望能够在关闭程序之前将其写入文件,然后在下次应用程序启动时从文件中读取以重新填充该结构 我的结构是HashMap。对象非常简单;对于成员变量,它有一个字符串和两个小型布尔型本机数组。这是一个非常简单的应用程序,我不希望一次超过10-15对 我一直在尝试对象输入/输出流(未成功)。是否需要使对象类可序列化 你能给我一些最好的建议吗?我只需要往正确的方向推一下。谢谢 编辑:我还是觉得自己很笨,我在一张地图上写字,在另一张地图上阅读,然后比较它们来检查我的结果。很明显,我把它们比

我有一个数据结构,我希望能够在关闭程序之前将其写入文件,然后在下次应用程序启动时从文件中读取以重新填充该结构

我的结构是
HashMap
。对象非常简单;对于成员变量,它有一个字符串和两个小型布尔型本机数组。这是一个非常简单的应用程序,我不希望一次超过10-15对

我一直在尝试对象输入/输出流(未成功)。是否需要使对象类可序列化

你能给我一些最好的建议吗?我只需要往正确的方向推一下。谢谢


编辑:我还是觉得自己很笨,我在一张地图上写字,在另一张地图上阅读,然后比较它们来检查我的结果。很明显,我把它们比较错了。叹气。

是的,如果要将对象写入文件系统,该对象必须实现可序列化的
。是的,您的对象需要实现
可序列化
,以便通过默认Java机制进行序列化
HashMap
String
已经实现了这个接口,因此可以成功地序列化

看看Sun自己的——它很短,我认为应该涵盖您的简单案例所需的所有内容。(您应该能够将
映射
对象序列化到流,然后在后续运行时将其读回)

如果确实遇到问题,请尝试使用一些伪值序列化简单的
HashMap
。如果成功,您将知道问题(不知何故)在于您自己的类的可序列化性;或者,如果这不起作用,您可以在将自己的类放入混合之前,将注意力集中在基本结构上


如果您有任何自己无法解决的更具体问题,请发回。

如果您不特别关心对象,您只需要字符串的键值对,字符串,那么我建议您使用。否则就给你

        Map map = new HashMap();
        map.put("1",new Integer(1));
        map.put("2",new Integer(2));
        map.put("3",new Integer(3));
        FileOutputStream fos = new FileOutputStream("map.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(map);
        oos.close();

        FileInputStream fis = new FileInputStream("map.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Map anotherMap = (Map) ois.readObject();
        ois.close();

        System.out.println(anotherMap);

在您进一步了解它的用途之前,不要麻烦将其序列化。你想看看FileWriter和google的“java文件io”,写这些数据的一个好方法是CSV

例如

键1,键2,键3 值A1、值A2、值A3 值B1、值B2、值B3


希望这有帮助。

我建议不要使用
Serializable
;这比最初看起来要困难得多。似乎您只需要简单地添加
实现可序列化的
。但事实上,这给代码增加了许多限制,在实际软件开发中(而不是在学校)很难处理这些限制。要了解这些限制有多可怕,请参阅Bloch的书。

序列化哈希映射:
Map m = new HashMap();
// let's use untyped and autoboxing just for example
m.put("One",1);
m.put("Two",2);

ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("foo.ser")
);
oos.writeObject(m);
oos.flush();
oos.close();
这段代码运行良好,我已经在我的应用程序中实现和使用。Plz为保存地图和检索地图提供相应的ur功能

重要的是,您需要确认您作为值放入映射中的对象必须是可序列化的,这意味着它们应该实现serailizbele接口。前任。 Map hashmap=新建hashmap()。。在这一行中,map和string都是隐式可序列化的,所以我们不需要显式地为它们实现serializable,但是如果您将自己的对象放在可序列化的位置上


publicstaticvoidmain(字符串arr[])
{
Map hashmap=新hashmap();
hashmap.put(“键1”、“值1”);
hashmap.put(“键2”、“值2”);
hashmap.put(“键3”、“值3”);
hashmap.put(“键4”、“值4”);
文件输出流;
试一试{
fos=新文件输出流(“c://list.ser”);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(hashmap);
oos.close();
FileInputStream fis=新的FileInputStream(“c://list.ser”);
ObjectInputStream ois=新ObjectInputStream(fis);
Map anotherList=(Map)ois.readObject();
ois.close();
System.out.println(另一个列表);
}catch(FileNotFoundException){e.printStackTrace();
}catch(ioe){e.printStackTrace();
}catch(ClassNotFoundException){e.printStackTrace();
}
}

HashMap已可序列化。当您试图将其写入ObjectOutputStream时出现了什么问题?对象输入/输出流不是唯一的方法。您是否特别需要关于使用它们的建议?还是在I/O上?@Raedwald-真的只是在寻找一个简单应用程序的最佳方式。谷歌引导我使用对象流。@finnw-我从网络上找到的示例中编码,但它们都是示例,我正在处理。我的对象类是可序列化的,但我不确定是否正确实现了它。第一次!2017年有一个有趣的库:您不需要实现可序列化的
。只有当你想把Java序列化格式作为你的文件格式时,情况才是这样。这不是提问者想要的吗?他正在玩对象输入/输出流…感谢教程。现在阅读!我肯定没有使用.ser扩展名,我会试试的。谢谢。ser扩展似乎已经解决了我的问题。现在我必须去读一读为什么会这样。你赢了。
.ser
不应该是核心问题,你可以在这里提供任何扩展,这里也没有任何扩展也会起作用。是的,
.ser
扩展对Java来说毫无意义。我从一个地图上写,读到另一个地图上,然后比较它们来检查我的结果。很明显,我把它们比较错了。叹气。为什么csv是比序列化更好的解决方案?序列化不涉及额外的代码,而您必须自己获取/编写csv格式/解析代码。我们倾向于避免可序列化对象,除非我们绝对必须使用它们。他们有比人们意识到的更多的东西。像Raedwald一样,我也受到Bloch的“高效Java”的影响。csv有它自己的陷阱。你是怎么认识他的
public static void main(String arr[])
{
  Map<String,String> hashmap=new HashMap<String,String>();
 hashmap.put("key1","value1");
    hashmap.put("key2","value2");
    hashmap.put("key3","value3");
    hashmap.put("key4","value4");

     FileOutputStream fos;
    try {
        fos = new FileOutputStream("c://list.ser");

    ObjectOutputStream oos = new ObjectOutputStream(fos);
     oos.writeObject(hashmap);
     oos.close();

     FileInputStream fis = new FileInputStream("c://list.ser");
     ObjectInputStream ois = new ObjectInputStream(fis);
    Map<String,String> anotherList = (Map<String,String>) ois.readObject();

     ois.close();

     System.out.println(anotherList);

 } catch (FileNotFoundException e) {e.printStackTrace();
 } catch (IOException e) {e.printStackTrace();
    } catch (ClassNotFoundException e) {e.printStackTrace();
    }

}