今日学习内容
第 4 天:数据流与对象序列化(ObjectOutputStream 和 ObjectInputStream)
学习内容
1.什么是序列化和反序列化:
序列化:将 Java 对象转换为字节流并存储到文件中。
反序列化:从文件读取字节流并恢复 Java 对象。
ObjectOutputStream 和 ObjectInputStream:
ObjectOutputStream.writeObject() 方法将对象写入文件。
ObjectInputStream.readObject() 方法从文件读取对象并转换回 Java 对象。
2.如何让类支持序列化:
实现 Serializable 接口。
3.实践任务
编写 Java 程序:
创建一个 Student 类,包含 name 和 age 属性,并实现 Serializable 接口。
创建 Student 对象,并使用 ObjectOutputStream 将其写入文件 student.dat。
使用 ObjectInputStream 读取该文件,并恢复 Student 对象,打印其信息。
1.基本概念
2.1 序列化与反序列化
- 序列化:将 Java 对象转换为字节流,并保存到文件中,便于在网络传输或者存储时使用。
- 反序列化:从文件中读取字节流,再将其转换回 Java 对象,使得对象状态得以恢复。
2.2 ObjectOutputStream 与 ObjectInputStream
-
ObjectOutputStream
- 主要方法:
writeObject(Object obj)—— 将一个对象写入输出流。 - 用途:将 Java 对象转换为字节流并写入到文件或其他输出介质。
- 主要方法:
-
ObjectInputStream
- 主要方法:
readObject()—— 从输入流中读取对象,并转换回 Java 对象。 - 用途:将存储的字节流还原为原始的 Java 对象。
- 主要方法:
2. 如何让类支持序列化
- 实现 Serializable 接口
- 只有实现了 java.io.Serializable 接口的类才能被序列化。
- 该接口为一个标记接口,不需要实现任何方法,只起到标识作用。
3.实践任务
任务目标
1.创建 Student 类:
- 属性:name(姓名)、age(年龄)。
- 实现 Serializable 接口,使对象可以被序列化。
2.对象写入:
- 创建 Student 对象。
- 使用 ObjectOutputStream 将 Student 对象写入文件(如:student.dat)。
3.对象读取:
- 使用 ObjectInputStream 从文件中读取字节流。
- 反序列化得到 Student 对象,并打印其信息。
示例代码
import java.io.*; // 导入 Java I/O 包,包含文件操作和对象序列化相关的类
// 定义 Student 类,并实现 Serializable 接口,标记该类的对象支持序列化
public class Student implements Serializable {
// 定义私有成员变量:姓名和年龄
private String name;
private int age;
// 构造器:用于初始化 Student 对象的姓名和年龄
public Student(String name, int age) {
this.name = name; // 初始化姓名
this.age = age; // 初始化年龄
}
// Getter 方法:获取学生的姓名
public String getName() {
return name;
}
// Getter 方法:获取学生的年龄
public int getAge() {
return age;
}
// 重写 toString() 方法,用于返回 Student 对象的字符串表示,便于输出调试信息
@Override
public String toString() {
// 返回格式化后的字符串,包含姓名和年龄信息
return "Student{name='" + name + "', age=" + age + "}";
}
}
// 主类,包含 main 方法作为程序入口
public class SerializationDemo {
public static void main(String[] args) {
// 创建一个 Student 对象,名字为 "Alice",年龄为 20
Student student = new Student("Alice", 20);
// 指定序列化文件的名称,保存序列化数据的文件
String fileName = "student.dat";
// 序列化过程:将 Student 对象转换为字节流并写入文件
try (
// 创建 ObjectOutputStream 对象,用于将对象写入文件
// FileOutputStream 用于打开或创建指定文件
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName))
) {
// 使用 writeObject() 方法将 student 对象写入到文件中
oos.writeObject(student);
// 输出提示信息,表示序列化成功
System.out.println("Student 对象已序列化到 " + fileName);
} catch (IOException e) {
// 捕获并打印在序列化过程中可能发生的 I/O 异常
e.printStackTrace();
}
// 反序列化过程:从文件中读取字节流并恢复为 Student 对象
try (
// 创建 ObjectInputStream 对象,用于从文件中读取对象数据
// FileInputStream 用于打开指定文件进行读取
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName))
) {
// 使用 readObject() 方法读取文件中的对象数据,并强制转换为 Student 类型
Student readStudent = (Student) ois.readObject();
// 输出读取到的 Student 对象的信息
System.out.println("反序列化得到的 Student 对象:" + readStudent);
} catch (IOException | ClassNotFoundException e) {
// 捕获并打印反序列化过程中可能发生的 I/O 异常或找不到类的异常
e.printStackTrace();
}
}
}
注解说明
1.导入包:import java.io.*; 导入了所有用于文件操作和序列化的类。
2.Student 类:
- 实现
Serializable接口,标记该类可被序列化。 - 包含私有属性
name和age,以及对应的构造器和 Getter 方法。 - 重写了
toString()方法,方便对象信息输出。
3.SerializationDemo 类:
- 在
main方法中,首先创建一个Student对象,并指定保存序列化数据的文件名。 - 序列化部分:使用
ObjectOutputStream将对象写入文件,捕获可能的IOException。 - 反序列化部分:使用
ObjectInputStream从文件中读取对象,并进行类型转换,同样捕获可能的异常(IOException和ClassNotFoundException)。
4. 知识点总结
- 序列化与反序列化:是对象在存储和传输中的关键技术。
- ObjectOutputStream 与 ObjectInputStream:分别用于写入和读取对象数据。
- 实现 Serializable 接口:是确保一个类的对象能够被序列化的必要条件。
- 实践任务:通过编写代码练习,将理论知识转化为实战技能。
5. 今日生词
1.feature 2.promote 3.engage 4.generate 5.interaction

261

被折叠的 条评论
为什么被折叠?



