JAVA IO将流划分为两类:节点流和处理流 节点流:俗称"低级流",特点:真实连接我们程序和另一端的"管道",负责实际读写数据的流 文件流就是典型的节点流,真实连接我们程序与文件的"管道",可以读写文件数据了。 处理流:俗称"高级流" 特点: 1:不能独立存在(单独实例化进行读写操作不可以) 2:必须连接在其他流上,目的是当数据"流经"当前流时,可以对其做某种加工操作,简化我们的工作、 流的连接:实际开发中经常会串联一组高级流最终到某个低级流上,对数据进行流水线式的加工读写。
对象流java.io.ObjectOutputStream和java.io.ObjectInputStream
对象流是一对高级流,可以方便我们读写任何java对象
Person类需要实现接口Serializable,需要添加构造和get set方法
serialVersionUID=42L;42L是版本号是个常量可以随意
public class Person implements Serializable {
public static final long serialVersionUID = 42L;
private String name;
private int age;
private String gender;
private transient String[] otherInfo;
//transient 在序列化中可以忽略属性)
public Person(String name, int age, String gender, String[] otherInfo) {
this.name = name;
this.age = age;
this.gender = gender;
this.otherInfo = otherInfo;
}
对象序列化
public static void main(String[] args) throws Exception {
//将一个Person对象写入文件person.obj
/*
1:想办法将Person对象转换为一组字节(高级流:ObjectOutputStream)
2:这一组字节写入到文件中(低级流:FileOutputStream)
*/
String name = "hh";
int age = 55;
String gender = "男";
String[] otherInfo = {"akankdvkdvndkvmdkvmd", "iahoahadoiha", "666"};
Person p = new Person(name, age, gender, otherInfo);
FileOutputStream fos = new FileOutputStream("./person.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
/*
当我们进行对象序列化时,可能出现异常
java.io.NotSeriolizableException
这是由于写出的对象没有实现序列化接口导致的
*/
oos.writeObject(p);
System.out.println("写出完成");
oos.close();
}
反对象序列化
public static void main(String[] args) throws Exception {
FileInputStream fis=new FileInputStream("person.obj");
ObjectInputStream ois=new ObjectInputStream(fis);
Person p=(Person) ois.readObject();
System.out.println(p);
ois.close();
}