Java IO流03:对象字节流
对象字节流,使用流传输对象,该过程称为序列化\反序列化
对象字节流的特点:
- 拥有缓冲区
- 可以读写八大基本数据类型和字符串
- 可以读写对象
ObjectOutputStream子类
通过writeObject()方法向流中写入一个对象,这个过程称为序列化
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
public class Main{
public static void main(String[] args) throws Exception {
FileOutputStream file1 = new FileOutputStream("d:\\out.bin");
FileOutputStream file2 = new FileOutputStream("d:\\out.bin");
/**
* 创建对象输出流,将一个字节输出流作为参数
*/
ObjectOutputStream oo1 = new ObjectOutputStream(file1);
ObjectOutputStream oo2 = new ObjectOutputStream(file2);
/**
* 序列化,写入一个对象
*/
Test test = new Test("ty", 25);
oo1.writeObject(test);
/**
* 序列化写入多个对象,可以将对象添加进集合
*/
ArrayList<Test> list = new ArrayList<>();
Test test1 = new Test("ty", 25);
Test test2 = new Test("tao", 26);
list.add(test1);
list.add(test2);
oo2.writeObject(list);
/**
* 关闭输出流
*/
oo1.close();
oo2.close();
}
}
/**
* 自定义类的对象想要进行流的输出,必须要实现Serializable序列化接口,如果对象有属性是由类生成的,这个类也要实现接口
*/
class Test implements Serializable{
String name;
/**
* 使用transient和static关键字修饰属性,这个属性就不会被序列化
*/
transient int age;
public Test(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Test{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
ObjectInputStream子类
通过readObject()方法从流中读取一个对象,这个过程称为反序列化
注意:读入对象的程序中,不能修改原来类的代码,否则序列化版本ID发生改变,将会无法识别
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.util.ArrayList;
public class Main{
public static void main(String[] args) throws Exception {
/**
* 创建字节输入流,传入之前序列化过的文件
*/
FileInputStream file1 = new FileInputStream("d:\\out.bin");
FileInputStream file2 = new FileInputStream("d:\\out.bin");
/**
* 创建对象输入流,将有序列化文件的字节输入流作为参数
*/
ObjectInputStream oi1 = new ObjectInputStream(file1);
ObjectInputStream oi2 = new ObjectInputStream(file2);
/**
* 反序列化,读入一个对象
*/
Test test = (Test) oi1.readObject();
/**
* 反序列化多个对象,对集合操作
*/
ArrayList<Test> list = (ArrayList) oi2.readObject();
/**
* 关闭输入流
*/
oi1.close();
oi2.close();
System.out.println(test.toString());
System.out.println(list.toString());
}
}
/**
* 类的代码不能发生任何改变,否则无法识别
*/
class Test implements Serializable{
String name;
transient int age;
public Test(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Test{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}