一、序列流【重点】
1、概述
序列流用于操作java的对象。
序列化流: 对象输出流,把对象输出到硬盘中做永久存储。
反序列化流:对象输入流。把硬盘中的对象输入到内存中来。
2、ObjectOutputStream类
构造方法
public ObjectOutputStream(OutputStream out) : 创建一个指定的ObjectOutputStream
写出对象方法
public final void writeObject (Object obj) : 将指定的对象写出。
常见的两个疑惑
Serializable这个接口我们称为是标记型接口,这个接口中没有任何的方法。
输出的对象在电脑中显示是乱码,这是正常的。因为windows根本就没有查看对象的方式。
代码演示
import java.io.Serializable;
public class Student implements Serializable{
private String name;
private int age;
private String sex;
private int score;
//构造 set get toString()
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Test01_序列化流 {
public static void main(String[] args) throws IOException {
//创建对象
//ObjectOutputStream(OutputStream out) : 创建一个指定的ObjectOutputStream
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\jin\\Desktop\\对象.txt"));
//创建学生对象
Student s = new Student("老王",38,"男",99);
//输出一个对象
oos.writeObject(s);
//关流
oos.close();
}
}
3、ObjectInputStream类
构造方法
public ObjectInputStream(InputStream in) : 创建一个指定的ObjectInputStream
读取对象方法
public final Object readObject() : 读取一个对象。
代码演示
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
public class Test02_反序列化流 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建反序列化对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\jin\\Desktop\\对象.txt"));
//读取
Object o = ois.readObject();
//向下转型(把父类转成子类类型)
Student stu = (Student) o;
//打印
System.out.println(stu);
}
}
4、对象操作流的作用
对象操作流的功能就是输出和输入【对象】。
5、对象操作流的小知识点
transient关键字
//瞬态的。被修饰的成员变量不会被序列化。
//瞬态
private transient int score;
serialVersionUID编号
每个类其实都有一个编号,在自己不指定编号的时候,系统会分配一个编号,每次修改类编号都会自动变化。
在序列化和反序列化中间如果编号发生了改变,反序列化就会报错。
所以可以手动给定一个类的编号,手动给的编号是不会变化的。
private static final long serialVersionUID = -6834534345343443L;
序列化多个对象:
序列化的时候建议不要保存多次,如果有多个对象建议一次性输出。把多个对象保存在一个集合中,然后输出一个集合。
public class Test03_序列化流 {
public static void main(String[] args) throws IOException {
//创建对象
//ObjectOutputStream(OutputStream out) : 创建一个指定的ObjectOutputStream
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\jin\\Desktop\\对象.txt"));
//创建学生对象
Student s1 = new Student("老王",38,"男",99);
Student s2 = new Student("小王",48,"男",69);
Student s3 = new Student("大王",58,"男",79);
//创建一个集合
ArrayList<Student> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
//输出一个集合对象
oos.writeObject(list);
//关流
oos.close();
}
}
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
@SuppressWarnings("all")
public class Test04_反序列化流 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建反序列化对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\jin\\Desktop\\对象.txt"));
//读取
Object o = ois.readObject();
//向下转型(把父类转成子类类型)
ArrayList<Student> list = (ArrayList<Student>) o;
//打印
System.out.println(list);
}
}