如何读取写在文件中的 LinkedHashMap?
How to read a LinkedHashMap written in file?
我想从写在 .txt 文件中的 LinkedHashMap 中读取特定值,但显示 "java.io.StreamCorruptedException: invalid stream header: 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 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中的条目,检查它是否正在读取;但实际上我只想只读 "name" 条目存储在 hashmap 中。
你只是:写成字符串,但回读时期待二进制序列化对象!
你知道,这就像:你把一个鸡蛋放在一个盒子里,然后你希望你可以打开那个盒子,把里面的牛奶倒进玻璃杯里!那行不通的。
这里:
bw.write(m.toString());
您将地图作为原始字符串写入该文件。这意味着您的文件现在包含人类可读的字符串!
但是你这样做了:
Map<String, String> myMap=(LinkedHashMap<String, String>) is.readObject();
期望文件包含序列化对象。
长话短说,这些是您的选择:
- 继续编写这些字符串,但随后您需要实现自己的 解析器 来读取此类文本文件,并将它们转换回地图中的对象
- 不要编写原始文本字符串,而是使用 gson 或 jackson 等库并将您的地图序列化为 JSON 字符串(这要求所有 keys/values 都可以序列化为 JSON )
- 而不是编写原始文本或JSON,而是使用默认的Java序列化机制并序列化为二进制内容,这要求所有keys/values实现Serializable接口。请参阅此处了解详细的 tutorial 如何执行此操作。
我的建议:选择选项 2 或 3。2 添加对第 3 方库的依赖,但我认为这是现在更多 "common" 实践。
您需要 serialize/deserialize 对象,而不仅仅是 reading/writing 其 toString 表示形式到文件。
参见:https://javahungry.blogspot.com/2017/11/how-to-serialize-hashmap-in-java-with-example.html
我想从写在 .txt 文件中的 LinkedHashMap 中读取特定值,但显示 "java.io.StreamCorruptedException: invalid stream header: 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 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中的条目,检查它是否正在读取;但实际上我只想只读 "name" 条目存储在 hashmap 中。
你只是:写成字符串,但回读时期待二进制序列化对象!
你知道,这就像:你把一个鸡蛋放在一个盒子里,然后你希望你可以打开那个盒子,把里面的牛奶倒进玻璃杯里!那行不通的。
这里:
bw.write(m.toString());
您将地图作为原始字符串写入该文件。这意味着您的文件现在包含人类可读的字符串!
但是你这样做了:
Map<String, String> myMap=(LinkedHashMap<String, String>) is.readObject();
期望文件包含序列化对象。
长话短说,这些是您的选择:
- 继续编写这些字符串,但随后您需要实现自己的 解析器 来读取此类文本文件,并将它们转换回地图中的对象
- 不要编写原始文本字符串,而是使用 gson 或 jackson 等库并将您的地图序列化为 JSON 字符串(这要求所有 keys/values 都可以序列化为 JSON )
- 而不是编写原始文本或JSON,而是使用默认的Java序列化机制并序列化为二进制内容,这要求所有keys/values实现Serializable接口。请参阅此处了解详细的 tutorial 如何执行此操作。
我的建议:选择选项 2 或 3。2 添加对第 3 方库的依赖,但我认为这是现在更多 "common" 实践。
您需要 serialize/deserialize 对象,而不仅仅是 reading/writing 其 toString 表示形式到文件。
参见:https://javahungry.blogspot.com/2017/11/how-to-serialize-hashmap-in-java-with-example.html