Java学习——day18


今日学习内容

第 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 从文件中读取对象,并进行类型转换,同样捕获可能的异常(IOExceptionClassNotFoundException)。

4. 知识点总结

  • 序列化与反序列化:是对象在存储和传输中的关键技术。
  • ObjectOutputStream 与 ObjectInputStream:分别用于写入和读取对象数据。
  • 实现 Serializable 接口:是确保一个类的对象能够被序列化的必要条件。
  • 实践任务:通过编写代码练习,将理论知识转化为实战技能。

5. 今日生词

1.feature 2.promote 3.engage 4.generate 5.interaction

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值