0%

Java-37-对象流

对象流

前面学习的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各种基本数据类型的数据以及对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中接收这些数据或重构对象。
  • ObjectInputStreamObjectInputStream 对以前使用 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;

// 注意:如果需要使用对象流操作这个类创建出来的对象,就必须实现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对象。

image-20230619214141059

并且打开后,该文件无法正常显示,说明其为二进制文件。

image-20230619214213141

反序列化

反序列化主类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执行反序列化操作。

image-20230619214329955

-------------本文结束感谢您的阅读-------------