我想从写入.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编写的所有条目,以检查是否正在读取;但实际上我只想读取存储在哈希图中的“名称”条目。
答案 0 :(得分:5)
您很简单:写为字符串,但是读回一个二进制的序列化对象!
您知道,这就像:您将一个鸡蛋放入一个盒子中,然后期望您可以打开该盒子并将牛奶倒入杯子中!那行不通。
这里:
bw.write(m.toString());
您将映射作为原始字符串写入该文件。这意味着您的文件现在包含人类可读的字符串!
但是您这样做:
Map<String, String> myMap=(LinkedHashMap<String, String>) is.readObject();
希望该文件包含序列化的对象。
长话短说,这些是您的选择:
我的建议:选择选项2或3。2将依赖项添加到第三方库中,但是我认为这是如今更为“常见”的做法。
答案 1 :(得分:1)
您需要序列化/反序列化对象,而不仅仅是读取/写入其toString表示形式到文件中。
请参阅:https://javahungry.blogspot.com/2017/11/how-to-serialize-hashmap-in-java-with-example.html