Java IO: ObjectOutputStream 类

借助 Java 的 ObjectOutputStream 类(即 java.io.ObjectOutputStream),你不仅能够向 OutputStream 写入原始字节,还能将 Java 对象写入其中。只需把 OutputStream 封装在 ObjectOutputStream 里,便可以轻松地向其写入对象。

在 Java 编程里,ObjectOutputStream 常与 ObjectInputStream 搭配使用。ObjectOutputStream 的主要功能是将 Java 对象写入流,而 ObjectInputStream 则用于从流中再次读取这些对象。接下来,你会看到一个展示它们如何协同工作的示例。

ObjectOutputStream 示例

以下是一个 Java 的 ObjectOutputStream 示例:

ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.data"));
MyClass object = new MyClass();
output.writeObject(object);
output.close();

首先,该示例创建了一个 OutputOutputStream,与 FileOutputStream 相连。然后,示例创建了一个 MyClass 对象,并将其写入 ObjectOutputStream。最后,示例关闭 ObjectOutputStream。

注意:在序列化和反序列化对象之前,对象的类必须实现 java.io.Serializable。

ObjectInputStream 与 ObjectOutputStream 结合使用

下面将展示一个将 ObjectInputStream 与 ObjectOutputStream 结合使用的示例。演示如何对 Java 对象进行序列化和反序列化,如下:

package com.hxstrive.java_io;

import java.io.*;

public class ObjectInputStreamExample {
    public static void main(String[] args) throws Exception {
        // 序列化
        try(ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.data"))) {
            Person person = new Person(1, "张三");
            out.writeObject(person);
        }

        // 反序列化
        try(ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.data"))) {
            Person person = (Person)in.readObject();
            System.out.println(person); // 输出:Person{id=1, name='张三'}
        }
    }

    // 实现了 Serializable 标记接口
    static class Person implements Serializable {
        private int id;
        private String name;

        public Person(int id, String name) {
            this.id = id;
            this.name = name;
        }

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

上面示例,首先创建了一个与 FileOutputStream 相连的 ObjectOutputStream,接着创建一个 Person 对象并将其写入 ObjectOutputStream,即 object.data 文件。

然后,创建了一个与 ObjectOutputStream 连接到相同文件的 ObjectInputStream,并且从 ObjectInputStream 中读入一个对象,并将其转换为 Person 对象,最后将读入 Person 对象的值打印到 控制台。

关闭 ObjectOutputStream

在完成向 ObjectOutputStream 写入数据的操作后,务必记得关闭该流。当你关闭 ObjectOutputStream 时,它所写入的 OutputStream 实例也会随之关闭。

若要关闭 ObjectOutputStream,需调用其 close() 方法。例如:

objectOutputStream.close();

您还可以使用 Java 7 中引入的 try-with-resources 结构,如下:

OutputStream output = new FileOutputStream("object.data");
try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(output)){
    Person person = new Person();
    objectOutputStream.writeObject(person);
}

值得留意的是,上述示例此处不再有任何显式的 close() 方法调用,try-with-resources 结构已经妥善解决了资源关闭的问题。

另外,首个 FileOutputStream 实例并非在 try-with-resources 代码块内创建的。这表明 try-with-resources 块不会自动对该 FileOutputStream 实例进行关闭操作。但当 ObjectOutputStream 关闭时,它会顺带关闭其所写入的 OutputStream 实例。所以,该 FileOutputStream 实例会在 ObjectOutputStream 关闭时一同被关闭。

说说我的看法
全部评论(

实际开发中用 ObjectOutputStream 进行序列化很少,基本都是序列化为 JSON 字符串进行传输,跨语言性更好。

回复:

是的,使用类似 FastJSON 到库,非常方便。

关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号