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

第1关:学习-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

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,序列化给定 Student 对象到给定文件中,再通过反序列化把其转化为一个对象,具体要求如下:

  • 接收给定的一行字符串(如:/test/a.txt Bob 23,第一部分为给定文件路径,第二部分为 Student 对象姓名,第三部分为 Student 对象年龄);
  • 给 Student 对象属性赋值,并序列化到文件中;
  • 通过反序列化把文件内容转化为一个对象,并输出所有属性值。

Student 类代码如下:

  1. import java.io.Serializable;
  2. public class Student implements Serializable {
  3. public String name;
  4. public int age;
  5. }

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。

例: 测试输入:

  1. /test/a.txt Bob 23

预期输出:

  1. Bob
  2. 23

开始你的任务吧,祝你成功!

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;

public class FileTest {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 接收给定的数据
        Scanner scanner = new Scanner(System.in);
        String filedir = scanner.next();
        String name = scanner.next();
        int age = scanner.nextInt();

        // 请在此编写代码
        /********** Begin **********/
        // 创建Student对象
        Student stu = new Student(name,age);
        // 给对象属性赋值
        File file = new File(filedir);
        // 序列化对象到文件中,并通过反序列化读取文件内容,最后打印对象的所有属性
        ObjectOutputStream oos = new ObjectOutputStream(new  FileOutputStream(file));
        
        oos.writeObject(stu);

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));

        System.out.print(ois.readObject());
        /********** End **********/

    }
}
import java.io.Serializable;

public class Student implements Serializable {
    public String name;
    public int age;
    public Student(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String toString (){
       return this.name+"\n"+this.age;
    }
}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java中,可以通过对象IO流进行对象序列化对象序列化是指将Java对象转换为字节序列的过程,以便可以将其存储在文件中或通过网络传输。 要进行对象序列化,需要满足以下条件: 1. Java类必须实现java.io.Serializable接口。 2. 所有对象的非瞬态变量都必须是可序列化的。 实现对象序列化的基本步骤如下: 1. 创建一个实现Serializable接口的Java类。 2. 创建一个ObjectOutputStream对象,并使用它来将Java对象写入文件或通过网络发送。 3. 创建一个ObjectInputStream对象,并使用它来从文件或网络接收Java对象。 4. 使用writeObject()方法将Java对象写入ObjectOutputStream对象。 5. 使用readObject()方法从ObjectInputStream对象读取Java对象。 以下是一个示例代码,演示如何将一个Java对象序列化并写入文件中: ``` import java.io.*; public class SerializeDemo { public static void main(String[] args) { Employee e = new Employee(); e.name = "John Doe"; e.address = "1234 Main Street"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in employee.ser"); } catch (IOException i) { i.printStackTrace(); } } } class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number; } ``` 在这个示例中,我们定义了一个名为Employee的类,并实现了Serializable接口。我们创建了一个Employee对象,并使用ObjectOutputStream将它写入文件中。最后,我们打印一条消息,表示对象已经成功序列化并保存在文件中。 请注意,在Employee类中,SSN字段被标记为transient,这意味着它不会被序列化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值