【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

热门专栏

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

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

在这里插入图片描述

相关文章
|
8月前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java输入输出:什么是NIO(New I/O)?
68 1
|
2月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
7月前
|
存储 缓存 Java
Java中的缓冲流提升I/O性能,通过内存缓冲区减少对硬件访问
【6月更文挑战第22天】Java中的缓冲流提升I/O性能,通过内存缓冲区减少对硬件访问。`BufferedInputStream`和`BufferedOutputStream`用于字节流,缓存数据批量读写。`BufferedReader`和`BufferedWriter`处理字符流,支持按行操作。使用后务必关闭流。
80 3
|
8月前
|
存储 监控 Java
深入探索Java语言的NIO(New I/O)技术
深入探索Java语言的NIO(New I/O)技术
|
6月前
|
存储 缓存 Oracle
可能是最漂亮的Java I/O流详解
大家有什么思路吗?评论区一起讨论讨论。我需要使用 Java 逐行读取大约 5-6 GB 的大型文本文件。我怎样才能快速完成此操作?最高赞的回答是叫Peter Lawrey的老哥回答的。大家好,我是南哥。一个Java学习与进阶的领路人,今天指南的是Java I/O流,跟着南哥我们一起在Java之路上成长。本文收录在我开源的《Java学习进阶指南》中,涵盖了想要学习Java、成为更好的Java选手都在偷偷看的核心知识、面试重点。
131 1
可能是最漂亮的Java I/O流详解
|
6月前
|
Java Linux
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
|
6月前
|
Java API 开发者
Java中的文件I/O操作详解
Java中的文件I/O操作详解
|
7月前
|
Java 视频直播 数据库连接
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
74 2
|
7月前
|
存储 网络协议 Java
Java I/O 详解:基础、文件操作与 NIO 实践
Java I/O 详解:基础、文件操作与 NIO 实践
69 1
|
6月前
|
Java 数据库
Java面试题:请解释Java中的输入输出(I/O)流?详细说明应用场景
Java面试题:请解释Java中的输入输出(I/O)流?详细说明应用场景
44 0