如何读取文件中写的LinkedHashMap?

时间:2019-05-15 08:04:03

标签: 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 {
            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();
        }
    }

它成功写入文件。但是当Iam尝试使用此方法读取上面的哈希图时

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();
    }

它显示“ java.io.StreamCorruptedException:无效的流头:7B495020”,并且没有读取数据

我试图读取用hashmap编写的所有条目,以检查是否正在读取;但实际上我只想读取存储在哈希图中的“名称”条目。

2 个答案:

答案 0 :(得分:5)

您很简单:写为字符串,但是读回一个二进制的序列化对象!

您知道,这就像:您将一个鸡蛋放入一个盒子中,然后期望您可以打开该盒子并将牛奶倒入杯子中!那行不通。

这里:

bw.write(m.toString());

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

但是您这样做:

Map<String, String> myMap=(LinkedHashMap<String, String>) is.readObject();

希望该文件包含序列化的对象。

长话短说,这些是您的选择:

  1. 继续编写这些字符串,但是您需要实现自己的解析器,该文件可以读取此类文本文件,并将其转换为地图中的对象
  2. 代替编写原始文本字符串,使用gson或jackson之类的库,然后将地图序列化为JSON字符串(这要求所有键/值都可以序列化为JSON)
  3. 代替编写原始文本或JSON,使用默认的Java序列化机制并序列化为二进制内容,这要求所有键/值都实现Serializable接口。请参见此处以获取不错的tutorial详细操作方法。

我的建议:选择选项2或3。2将依赖项添加到第三方库中,但是我认为这是如今更为“常见”的做法。

答案 1 :(得分:1)

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

请参阅:https://javahungry.blogspot.com/2017/11/how-to-serialize-hashmap-in-java-with-example.html