【Java I/O 流】对象流:ObjectInputStream 和 ObjectOutputStream

简介: 对象流有两个类:ObjectOutputStream 和 ObjectInputStream,其主要作用是将 Java 对象序列化为流数据,或将流数据反序列化为 Java 对象。

在这里插入图片描述

❤️ 个人主页:水滴技术
🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬
🌸 订阅专栏:Java 教程:从入门到精通

大家好,我是水滴~~

对象流有两个类:ObjectOutputStream 和 ObjectInputStream,其主要作用是将 Java 对象序列化为流数据,或将流数据反序列化为 Java 对象。

下面一起来看这两个类的详细介绍:

ObjectOutputStream(序列化流)

java.io.ObjectOutputStream 称为序列化流,它可以将 Java 对象序列化为流数据。该类继承了java.io.OutputStream,是一个处理流。

构造函数

该类有一个构造方法,因为它是一个处理流,所以需要一个节点流对象。

ObjectOutputStream(OutputStream out)

通过一个节点流,创建一个序列化流 ObjectOutputStream 对象。

常用方法

因为该类继承了 java.io.OutputStream 类,所以常用的一些写入方法都可以使用,这里只介绍一个特有的方法:

void writeObject(Object obj)

将指定的对象写入 ObjectOutputStream。写入对象的类,必须实现 java.io.Serializable 接口,否则会报 java.io.NotSerializableException 异常。

代码示例

该示例将一个对象进行序列化,并输出到指定文件中。

首先,创建一个 Person 实体类,并实现 java.io.Serializable 接口:

public class Person implements Serializable {
   
   

    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;

    public Person() {
   
   
    }

    public Person(String name, Integer age) {
   
   
        this.name = name;
        this.age = age;
    }

    public String getName() {
   
   
        return name;
    }

    public void setName(String name) {
   
   
        this.name = name;
    }

    public Integer getAge() {
   
   
        return age;
    }

    public void setAge(Integer age) {
   
   
        this.age = age;
    }

    @Override
    public String toString() {
   
   
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

然后,使用 ObjectOutputStream 对 Person 类进行序列化,并输出到指定文件:

// 实例化一个 Person 对象
Person person = new Person("杨过", 28);

// 通过 FileOutputStream 创建一个 ObjectOutputStream 实例
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c:/io/14_1.txt"));
// 将 Person 对象写入流中
oos.writeObject(person);
// 关闭流并释放资源
oos.close();

执行该代码后,会输出一个 c:/io/14_1.txt 文件,文件内容:
在这里插入图片描述

ObjectInputStream(反序列化流)

java.io.ObjectInputStream 称为反序列化流,它可以将流数据反序列化为 Java 对象。该类继承了 java.io.InputStream,是一个处理流。

构造函数

该类有一个构造方法,因为它是一个处理流,所以需要一个节点流对象。

ObjectInputStream(InputStream in)

通过一个节点流,创建一个反序列化流 ObjectInputStream 对象。

常用方法

因为该类继承了 java.io.InputStream 类,所以常用的一些读取方法都可以使用,这里只介绍一个特有的方法:

Object readObject()

从 ObjectInputStream 中读取一个对象。从流中读取的对象,要求其类必须存在,并且实现了 java.io.Serializable 接口。

代码示例

该代码示例读取上面示例中序列化的数据,并将其返序列化成对象。

读取 c:/io/14_1.txt 的内容,并反序列化。

// 通过 FileInputStream 实例来创建一个 ObjectInputStream 实例
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c:/io/14_1.txt"));
// 读取对象
Object o = ois.readObject();
// 关闭流并释放资源
ois.close();
// 打印对象
System.out.println(o.toString());

输出结果:

Person{
   
   name='杨过', age=28}

系列文章

🔥 【Java I/O 流】文件的操作——java.io.File 类详解

🔥 【Java I/O 流】I/O 流的原理与流的分类

🔥 【Java I/O 流】字节输入输出流:InputStream & OutputStream

🔥 【Java I/O 流】文件字节输入输出流:FileInputStream & FileOutputStream(文件读写案例)

🔥 【Java I/O 流】字符输入输出流:Reader 和 Writer

🔥 【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter

🔥 【Java I/O 流】字节缓冲流:BufferedInputStream 和 BufferedOutputStream

🔥 【Java I/O 流】字符缓冲流:BuffreadReader 和 BufferedWriter

🔥 【Java I/O 流】字节数组流:ByteArrayInputStream 和 ByteArrayOutputStream

🔥 【Java I/O 流】数据输入输出流:DataInputStream 和 DataOutputStream

热门专栏

👍 《IDEA 教程:从入门到精通

👍 《Java 教程:从入门到精通

👍 《MySQL 教程:从入门到精通

在这里插入图片描述

相关文章
|
2月前
|
Java
【Java】深入了解Java I/O 流
【Java】深入了解Java I/O 流
32 0
|
5月前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java输入输出:什么是NIO(New I/O)?
34 1
|
7月前
|
Java
Java I/O流知识点总结分享
Java I/O流知识点总结分享
|
7月前
|
Java 程序员 数据处理
【Java 多线程编程 | 从0到1】线程I/O模型
【Java 多线程编程 | 从0到1】线程I/O模型
85 0
|
8月前
|
Java
63.【Java I/O 操作】(四)
63.【Java I/O 操作】
31 0
|
8月前
|
Java
63.【Java I/O 操作】(三)
63.【Java I/O 操作】
27 0
|
8月前
|
Java
63.【Java I/O 操作】(二)
63.【Java I/O 操作】
34 0
|
8月前
|
Java
63.【Java I/O 操作】(一)
63.【Java I/O 操作】
39 0
|
9月前
|
存储 Java
[java]I/O
[java]I/O
45 0
|
9月前
|
Java
Java IO流--对象流ObjectInputStream和ObjectOutputStream及对象序列化机制的理解
Java IO流--对象流ObjectInputStream和ObjectOutputStream及对象序列化机制的理解
50 0