Java 如何读取文件中写入的LinkedHashMap?

Java 如何读取文件中写入的LinkedHashMap?,java,serialization,deserialization,readfile,Java,Serialization,Deserialization,Readfile,我想从.txt文件中写入的LinkedHashMap中读取特定值,但显示“java.io.StreamCorruptedException:无效流头:7B495020” 为了在LinkedHashMap中写作,我尝试了这种方法 public void WriteBasicInfo(String name, String pass) throws IOException, ParseException { Map<String, String> m; try {

我想从.txt文件中写入的LinkedHashMap中读取特定值,但显示“java.io.StreamCorruptedException:无效流头:7B495020”

为了在LinkedHashMap中写作,我尝试了这种方法

public void WriteBasicInfo(String name, String pass) throws IOException, ParseException {
    Map<String, String> m;
        try {
            m = new LinkedHashMap<String, String>();
            m.put("Name", name);
            m.put("Password", pass);

            BufferedWriter bw = new BufferedWriter(new FileWriter(FILE_NAME, false));
            bw.write(m.toString());
            bw.flush();
            bw.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
public void WriteBasicInfo(字符串名称,字符串传递)抛出IOException,ParseException{
地图m;
试一试{
m=新LinkedHashMap();
m、 放置(“名称”,名称);
m、 输入(“密码”,通过);
BufferedWriter bw=新的BufferedWriter(新的FileWriter(文件名,false));
write(m.toString());
bw.flush();
bw.close();
}捕获(例外情况除外){
例如printStackTrace();
}
}
并成功写入文件。但是当我试图用这个方法读取上面的hashmap时

public void readBasicInfo() throws IOException, ParseException, InvocationTargetException, ClassNotFoundException 
{
        ObjectInputStream is = new ObjectInputStream(new FileInputStream(FILE_NAME));
        Map<String, String> myMap=(LinkedHashMap<String, String>) is.readObject();

        for(Map.Entry<String,String> m :myMap.entrySet()){
                 System.out.println(m.getKey()+" : "+m.getValue());
        //  String val1=m.get("Name"); 
        }     
     ois.close();
    }
public void readBasicInfo()抛出IOException、ParseException、InvocationTargetException、ClassNotFoundException
{
ObjectInputStream is=新ObjectInputStream(新文件输入流(文件名));
Map myMap=(LinkedHashMap)是.readObject();
对于(Map.Entry m:myMap.entrySet()){
System.out.println(m.getKey()+“:”+m.getValue());
//字符串val1=m.get(“名称”);
}     
ois.close();
}
它显示“java.io.StreamCorruptedException:invalid stream header:7B495020”,未读取任何数据


我试着阅读hashmap中写的所有条目,以检查它是否正在阅读;但实际上,我只想要存储在hashmap中的只读“name”条目。

您很简单:以字符串形式写入,但回读时需要一个二进制序列化对象

你知道,这就像:你把一个鸡蛋放在一个盒子里,然后你期望你能打开那个盒子,把牛奶从里面倒进杯子里!那不行

在这里:

将映射作为原始字符串写入该文件。这意味着您的文件现在包含人类可读的字符串

但你会:

Map<String, String> myMap=(LinkedHashMap<String, String>) is.readObject();
Map myMap=(LinkedHashMap)是.readObject();
它期望文件包含序列化对象

长话短说,以下是您的选择:

  • 继续编写这些字符串,然后需要实现自己的解析器,用于读取这些文本文件,并将它们转换回映射中的对象
  • 不要编写原始文本字符串,而是使用诸如gson或jackson之类的库,将地图序列化为JSON字符串(这要求所有键/值都可以序列化为JSON)
  • 不要编写原始文本或JSON,而是使用默认的Java序列化机制并序列化为二进制内容,这需要所有键/值实现可序列化接口。请参阅此处,了解如何进行详细操作

  • 我的建议是:选择2号或3号选项。2为第三方库添加了依赖项,但我认为这是目前比较“常见”的做法

    您需要序列化/反序列化对象,而不仅仅是将其toString表示形式读/写到文件中


    请参阅:

    您需要序列化/反序列化对象,而不仅仅是读取/写入对象的
    toString
    表示形式到文件。请看:感谢您为我指明了正确的方向。!!通过hashmap中对象的序列化/反序列化解决。很抱歉,我想我只是在阅读您的答案,并遵循您提供的教程链接,同时获得了另一个链接(您也提供了),因为您那边有及时的响应。我没有办法给你们两票,但我首先要感谢你们。!
    Map<String, String> myMap=(LinkedHashMap<String, String>) is.readObject();