2022.5.5 I/O对象流
对象流
ObjectOutputStream / ObjectInputStream
-
增强了缓冲区功能
-
增强了读写8种基本数据类型和字符串的功能
-
增强了读写对象的功能
-
readObject()
从流中读取一个对象:反序列化 -
writeObject(Object obj)
向流中写入一个对象:序列化
-
使用流传输对象的过程称为序列化、反序列化
序列化与反序列化
序列化:向流中写入一个对象
序列化类必须继承接口Serializable
1 package com.xing; 2 3 import java.io.FileOutputStream; 4 import java.io.IOException; 5 import java.io.ObjectOutputStream; 6 import java.io.Serializable; 7 8 public class Demo06 { 9 public static void main(String[] args) throws IOException { 10 //创建输出流 11 FileOutputStream fos = new FileOutputStream("d:\\stu.bin"); 12 //创建对象输出流 13 ObjectOutputStream oos = new ObjectOutputStream(fos); 14 15 //序列化 :写入对象 16 Student s = new Student("小明", 23); 17 oos.writeObject(s);//写入一个对象 18 19 //关闭 20 oos.close(); 21 } 22 } 23 //继承接口Serializable 标记接口:表示此类可以序列化 里面无方法 标记接口 24 class Student implements Serializable { 25 private String name; 26 private int age; 27 28 public Student() { 29 } 30 31 public Student(String name, int age) { 32 this.name = name; 33 this.age = age; 34 } 35 36 public String getName() { 37 return name; 38 } 39 40 public void setName(String name) { 41 this.name = name; 42 } 43 44 public int getAge() { 45 return age; 46 } 47 48 public void setAge(int age) { 49 this.age = age; 50 } 51 52 @Override 53 public String toString() { 54 return "Student{" + 55 "name='" + name + '\'' + 56 ", age=" + age + 57 '}'; 58 } 59 }
反序列化:从流中读取一个对象
1 package com.xing; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.io.ObjectInputStream; 6 7 public class Demo07 { 8 public static void main(String[] args) throws IOException, ClassNotFoundException { 9 //创建输入流 10 FileInputStream fis = new FileInputStream("d:stu.bin"); 11 //创建对象输入流 12 ObjectInputStream ois = new ObjectInputStream(fis); 13 14 //反序列化:读文件 15 Student s = (Student) ois.readObject();//返回值为Object类型 做强转 16 17 //关闭 18 ois.close(); 19 System.out.println(s.toString()); 20 } 21 }
注意事项
-
某个类要想序列化必须实现Serializable接口
-
序列化类中对象(class)属性要求实现Serializable接口
-
序列化版本号ID,保证序列化的类和反序列化的类是同一个类
-
使用transient修饰属性,这个属性就不能序列化
-
静态属性不能序列化
-
序列化多个对象,可以借助集合来实现
1 package com.xing; 2 3 import java.io.FileOutputStream; 4 import java.io.IOException; 5 import java.io.ObjectOutputStream; 6 import java.io.Serializable; 7 import java.util.ArrayList; 8 9 public class Demo06 { 10 public static void main(String[] args) throws IOException { 11 //创建输出流 12 FileOutputStream fos = new FileOutputStream("d:\\stu.bin"); 13 //创建对象输出流 14 ObjectOutputStream oos = new ObjectOutputStream(fos); 15 16 //序列化 :写入对象 17 Student s1 = new Student("小红", 23); 18 Student s2 = new Student("小嘿", 23); 19 ArrayList<Student> arrayList = new ArrayList<>(); 20 arrayList.add(s1); 21 arrayList.add(s2); 22 oos.writeObject(arrayList);//写入一个集合 23 24 //关闭 25 oos.close(); 26 } 27 } 28 //继承接口Serializable 标记接口:表示此类可以序列化 里面无方法 标记接口 29 class Student implements Serializable { 30 private String name; 31 private int age; 32 33 public Student() { 34 } 35 36 public Student(String name, int age) { 37 this.name = name; 38 this.age = age; 39 } 40 41 public String getName() { 42 return name; 43 } 44 45 public void setName(String name) { 46 this.name = name; 47 } 48 49 public int getAge() { 50 return age; 51 } 52 53 public void setAge(int age) { 54 this.age = age; 55 } 56 57 @Override 58 public String toString() { 59 return "Student{" + 60 "name='" + name + '\'' + 61 ", age=" + age + 62 '}'; 63 } 64 }
1 package com.xing; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.io.ObjectInputStream; 6 import java.util.ArrayList; 7 8 public class Demo07 { 9 public static void main(String[] args) throws IOException, ClassNotFoundException { 10 //创建输入流 11 FileInputStream fis = new FileInputStream("d:stu.bin"); 12 //创建对象输入流 13 ObjectInputStream ois = new ObjectInputStream(fis); 14 15 //反序列化:读文件 16 ArrayList<Student> list = (ArrayList<Student>) ois.readObject();//返回集合类型 做强转 17 18 //关闭 19 ois.close(); 20 System.out.println(list.toString()); 21 22 } 23 } 24 25 26 27