Java语言ObjectOutputStream和ObjectInputStream的使用方法
常用方法
ObjectOutputStream
//创建对象写入流(写入到文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.dat")); //data.dat是文件名,可以带路径
//将对象写入文件
oos.writeObject(对象名);
注意:上面所示的方法,如果写入多个对象会覆盖,而不是追加。如果想要一次性写入多个方法,有两种做法:
- 1、把对象存到集合里,然后用oos.writeObject()将这个集合写入到文件中
- 2、在
new ObjectOutputStream(new FileOutputStream("data.dat"))
里面的new FileOutputStream("data.dat")
可以写上第二个参数为true,即new FileOutputStream("data.dat",true)
让这个流可以追加写入
ObjectInputStream
//创建对象读取流(从文件读取)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.dat"));//data.dat是文件名,可以带路径
//从文件读取Object,强转为泛型WaterResource的List
List<WaterResource> list2 = (List<WaterResource>) ois.readObject();
注意:使用ois.readObject()时要进行类型强转
例题:
创建可串行化的WaterResource类,有两个属性:国家名、人均水资源量。自定义文件data.dat,同时在Java程序中创建5个WaterResource类的实例,使用ObjectOutputStream类将这5个实例写入到data.dat文件中,再使用ObjectInputStream类将其读入并输出显示。
解释
可串行化详见博客:Java串行化(序列化)解释、 Idea2020.1设置自动生成serialVersionUID
代码
package com.ylw.question7;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Question7 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建5个实例对象
WaterResource wr1 = new WaterResource("中国",100000);
WaterResource wr2 = new WaterResource("美国",10000);
WaterResource wr3 = new WaterResource("俄罗斯",1000);
WaterResource wr4 = new WaterResource("法国",100);
WaterResource wr5 = new WaterResource("英国",10);
//把这5个实例对象放到list里
List<WaterResource> list = new ArrayList<WaterResource>();
list.add(wr1);
list.add(wr2);
list.add(wr3);
list.add(wr4);
list.add(wr5);
//创建对象写入流(写入到文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.dat"));
//写入文件
oos.writeObject(list);
//关闭写入流
oos.flush();oos.close();
//创建对象读取流(从文件读取)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.dat"));
//从文件读取Object,强转为泛型WaterResource的List
List<WaterResource> list2 = (List<WaterResource>) ois.readObject();
//遍历list2输出里面存的WaterResource实例对象
for(WaterResource wr : list2){
System.out.println(wr);
}
//关闭读取流
ois.close();
}
}
class WaterResource implements Serializable{
private String countryName; //国家名
private double perCapWaterResources; //人均水资源量
public WaterResource() {
}
public WaterResource(String countryName, double perCapWaterResources) {
this.countryName = countryName;
this.perCapWaterResources = perCapWaterResources;
}
@Override
public String toString() {
return "WaterResource{" +
"countryName='" + countryName + '\'' +
", perCapWaterResources=" + perCapWaterResources +
'}';
}
}
运行结果
data.dat文件
乱码原因:
ObjectOutputStream.writeObject()的作用是把一个实例的对象以文件的形式保存到磁盘上,
这个过程就叫Java对象的持久化。而这个文件是以二进制的形式编写的,当你用文本编辑器将它打开,这些二进制代码与某个字符集映射之后,显示出来的东西就成了乱码。(即使输出的是一个String的对象,也是以该String对象的二进制编码的形式输出,而不是输出String对象的内容。)我们需要通过ObjectInputStream来进行读取。