• 学习-Java输入输出之对象IO流之序列化一个对象


    任务描述

    本关任务:序列化给定 Student 对象到给定文件中,再通过反序列化把其转化为一个对象。

    相关知识

    之前我们学习了 InputStream(字节输入流)和 OutputStream (字节输出流),下面我们来了解一下它们的子类---ObjectInputStream (对象输入流)和 ObjectOutputStream(对象输出流)。

    为什么要有对象流

    有的时候,我们可能需要将内存中的对象持久化到硬盘上(序列化),或者将硬盘中的对象信息读到内存中(反序列化),这个时候我们需要使用对象流。

    序列化和反序列化

    序列化: 是对象转换成一个字节序列的过程,是一个写操作。 反序列化:一个字节序列转换成对象的过程 ,是一个读操作。 序列化和反序列化中对象所对应的类,必须是实现 Serializable 接口。

    ObjectOutputStream(对象输出流)

    ObjectOutputStream 是 OutputStream 的子类,也叫做序列化流。该流把对象转成字节数据输出到文件中保存,可实现对象的持久存储。

    ObjectOutputStream 的构造方法

    构造方法说明
    ObjectOutputStream(OutputStream out)使用底层输出流创建 ObjectOutputStream 对象

    构造方法示例:

    1. public static void main(String[] args) throws IOException {
    2. // 通过文件字节输出流创建对象输出流
    3. ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("C:\\Users\\yy\\Desktop\\d.txt"));
    4. }

    ObjectOutputStream 的常用方法

    下表是它的常用方法:

    方法说明
    write(byte[] w,int off,int len)把字节数组中偏移量从 off 开始的 len 个字节写入此输出流
    write(byte [] b)将字节数组写入此输出流
    writeBooolean()、writeByte()、writeShort()、writeInt()将指定的基本数据类型以字节的方式写入到输出流
    flush()刷新此输出流并强制写出所有缓冲的输出字节
    writeUTF(String s)将字符串格式化顺序写入底层的输出流
    writeObject(Object obj)特有的方法,将指定的对象写入 ObjectOutputStream 流

    通过 writeObject 方法将 Hero 对象写入文件示例:

    Hero 类:

    1. import java.io.Serializable;
    2. public class Hero implements Serializable { // 实现Serializable接口
    3. private static final long serialVersionUID = 1L; //表示这个类当前的版本
    4. public String name;
    5. public float hp;
    6. }

    Test类:

    1. public class Test {
    2. public static void main(String[] args) throws IOException {
    3. //创建一个Hero对象
    4. Hero h = new Hero();
    5. // 设置属性
    6. h.name = "garen";
    7. h.hp = 616;
    8. // 准备一个文件用于保存该对象
    9. File f =new File("C:\\Users\\yy\\Desktop\\d.txt");
    10. try(
    11. // 将Hero对象写入文件
    12. ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(f));){
    13. objectOutputStream.writeObject(h);
    14. }
    15. }
    16. }

    执行结果:将对象写入了 d.txt 文件。

    注意:Hero 类必须实现 Serializable 接口。

    ObjectInputStream(对象输入流)

    ObjectInputStream 是 InputStream 的子类,也叫做反序列流。该流将之前使用 ObjectOutputStream 序列化的原始数据恢复为对象,以流的方式读取对象。 ######ObjectInputStream 的构造方法

    下表中是它的构造方法:

    构造方法说明
    ObjectInputStream(InputStream in)使用底层输入流创建 ObjectInputStream 对象

    构造方法使用示例:

    1. public static void main(String[] args) throws IOException {
    2. // 通过文件字节输入流创建对象输入流对象
    3. ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("C:\\Users\\yy\\Desktop\\d.txt"));
    4. }

    ObjectInputStream 的常用方法

    下表是它的常用方法:

    方法说明
    read(byte[] r, int off, int len)从流中读入字节数据到缓冲区数组中指定位置,off 为数组偏移量,len 为写入长度。
    read(byte [] b)从流中读入字节数据到缓冲区数组中
    readBooolean()、readByte()、readShort()、readInt()从输入流中读取基本数据类型
    readUTF()按照格式化顺序读底层的输入流
    readObject()特有的方法,把对象读入 ObjectInputStream 流

    readObject 方法使用示例:

    1. public static void main(String[] args) throws IOException, ClassNotFoundException {
    2. try (
    3. // 通过文件字节输入流创建对象输入流对象
    4. ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("C:\\Users\\yy\\Desktop\\d.txt"));) {
    5. // 获取对象
    6. System.out.print(objectInputStream.readObject());
    7. }
    8. }

    执行结果:

    1. com.company.Hero@58372a00
    1. import java.io.*;
    2. import java.util.Arrays;
    3. import java.util.Scanner;
    4. public class FileTest {
    5. public static void main(String[] args) throws IOException, ClassNotFoundException {
    6. // 接收给定的数据
    7. Scanner scanner = new Scanner(System.in);
    8. String filedir = scanner.next();
    9. String name = scanner.next();
    10. int age = scanner.nextInt();
    11. // 请在此编写代码
    12. /********** Begin **********/
    13. // 创建Student对象
    14. Student student = new Student();
    15. // 给对象属性赋值
    16. student.name = name;
    17. student.age = age;
    18. // 序列化对象到文件中,并通过反序列化读取文件内容,最后打印对象的所有属性
    19. File file = new File(filedir);
    20. try (
    21. ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
    22. ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
    23. ){
    24. objectOutputStream.writeObject(student);
    25. Student student1 = (Student) objectInputStream.readObject();
    26. System.out.println(student1.name);
    27. System.out.println(student1.age);
    28. }
    29. /********** End **********/
    30. }
    31. }

     

  • 相关阅读:
    股票量化系统QTYX选股框架实战案例集|华为补涨龙三连板打板进,套利8个点离场-230908...
    springboot面试杀手锏-自动配置原理
    idea 对指定的commit记录打tag并推送远程
    独立站品牌出海盛行,大批卖家转型逐利
    WMS仓储管理系统的盘点功能解析
    谈谈我们是如何实践 OKR 的(多年宝贵实践经验逼坑指南)
    day18-web工程路径
    【记录】二进制的学习路线和资料
    亚马逊对IP的要求是什么?
    Prometheus 采集vCenter7监控数据
  • 原文地址:https://blog.csdn.net/weixin_46075438/article/details/128165491