对象流
前面学习的IO流,在程序代码中,要么将数据直接按照字节处理,要么按照字符处理。那么,如果读写Java其他数据类型的数据,怎么办呢?
1 2 3 4 5 6 7
| String name = "张三"; int age = 30; char gender = ‘男’; double price = 13.14; boolean is_boy = true;
Student stu = new Student("张三", 18);
|
Java提供了对象流来处理这些类型的数据:
ObjectOutputStream
:将Java
基本数据类型和对象写入字节输出流中。稍后可以使用 ObjectInputStream
将数据读入。通过在流中使用文件可以实现Java
各种基本数据类型的数据以及对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中接收这些数据或重构对象。
ObjectInputStream
:ObjectInputStream
对以前使用 ObjectOutputStream
写入的基本数据和对象进行反序列化。
构造方法如下:
1 2
| FileOutputStream fos = new FileOutputStream("object.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos);
|
1 2
| FileInputStream fis = new FileInputStream("object.txt"); ObjectInputStream ois = new ObjectInputStream(fis);
|
序列化与反序列化
Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的类型
和对象中存储的属性
等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据
、对象的类型
和对象中存储的数据
信息,都可以用来在内存中创建对象。看图理解序列化:
ObjectOutputStream流中支持序列化的方法是:
public final void writeObject (Object obj)
: 将指定的对象写出。
ObjectInputStream流中支持反序列化的方法是:
public final Object readObject ()
: 读取一个对象。
序列化举例
首先自定义一个类,后续所有的序列化和反序列化都针对该类进行操作。
Student类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package com.tipdm.demo3;
import java.io.Serializable;
public class Student implements Serializable { private String stuName; private int stuAge;
public Student() { }
public Student(String stuName, int stuAge) { this.stuName = stuName; this.stuAge = stuAge; }
public String getStuName() { return stuName; }
public void setStuName(String stuName) { this.stuName = stuName; }
public int getStuAge() { return stuAge; }
public void setStuAge(int stuAge) { this.stuAge = stuAge; }
@Override public String toString() { return "Student{" + "stuName='" + stuName + '\'' + ", stuAge=" + stuAge + '}'; } }
|
序列化操作TestObjectOutputStream
主类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.tipdm.demo3;
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream;
public class TestObjectOutputStream { public static void main(String[] args) { try { File file = new File("day10-code\\object.txt"); if(!file.exists()){ file.createNewFile(); } Student student1 = new Student("张三", 18); FileOutputStream fileOutputStream = new FileOutputStream(file); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(student1); objectOutputStream.flush(); } catch (Exception e) { e.printStackTrace(); } } }
|
运行完毕后在目录下会生成一个object.txt
对象。
并且打开后,该文件无法正常显示,说明其为二进制文件。
反序列化
反序列化主类TestObjectInputStream
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.tipdm.demo3;
import java.io.File; import java.io.FileInputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream;
public class TestObjectInputStream { public static void main(String[] args) { try{ ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("day10-code\\object.txt"))); Student student = (Student) objectInputStream.readObject(); System.out.println(student); }catch (Exception ex){ ex.printStackTrace(); } } }
|
运行该代码后,即可将前面生成的序列化文件object.txt
执行反序列化操作。