有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何读取写在文件中的LinkedHashMap?

我想从LinkedHashMap中读取以。txt文件,但显示“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();
        }
    }

并成功写入文件。但是当我试图用这种方法阅读上面的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();
    }

它显示“java.io.StreamCorruptedException:invalid stream header:7B495020”,并且没有读取任何数据

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


共 (1) 个答案

  1. # 1 楼答案

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

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

    这里:

    bw.write(m.toString());
    

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

    但你会:

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

    它期望文件包含序列化的对象

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

    1. 继续编写这些字符串,然后需要实现自己的解析器,该解析器读取这些文本文件,并将它们转换回地图中的对象
    2. 不要编写原始文本字符串,而是使用gson或jackson之类的库,将地图序列化为JSON字符串(这要求所有键/值都可以序列化为JSON)
    3. 不要编写原始文本或JSON,而是使用默认的Java序列化机制并序列化为二进制内容,这需要所有键/值实现可序列化接口。请看这里的详细介绍

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