提示

Java IO ObjectOutputStream 使用示例。@ermo

回到上一级

# ObjectOutputStream 使用示例

前面章节我们使用 DataOutputStreamDataInputStream 完成了将对象写入文件和读入内存的操作。但是这种操作有很多局限性,使用起来开发成本比较高。程序员在开发的过程中不仅需要关注读写的顺序,还要针对对象内不同类型的字段使用不同的写和读方法。

本章学习的 ObjectOutputStreamObjectInputStream 可以更快地完成对象的读写过程。

ObjectOutputStream 也是一个装饰类,继承了 FilterOutputStream 接口,它的主要构造方法有:

public ObjectOutputStream(OutputStream out)

protected ObjectOutputStream()

如果是将对象写入一个文件,我们就可以通过第一个构造方法创建一个输出流,并且可以用 BufferedOutputStream 包装一下,提高程序的运行速度。

ObjectOutStream 同时实现了 DataOutput 接口,拥有对基本属性的写方法。

在使用 ObjectOutputStream 的时候有一个前提,就是操作的对象必须实现 Serializable 接口,这是一个标记接口,没有任何的方法。代表当前类可以进行序列化。

看一个将对象写入文件的例子,这里还是使用之前的 Order 对象,只需要在之前的基础上实现 Serializable 接口即可。

// 省略 getter/setter 和 toString 方法
public class Order implements Serializable {

    private String orderNo;

    private Integer orderType;

    private Double orderAmount;
}
    public static void writeOrder(Order order) throws IOException {
        String filepath = "src/main/resources/write-order.txt";
        try (ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(filepath)));) {
            out.writeObject(order);
        }
    }

    public static void main(String[] args) throws Exception {
        Order order = new Order();
        order.setOrderNo("O123");
        order.setOrderType(1);
        order.setOrderAmount(99.99);
        writeOrder(order);
    }

上述代码很简单,就是将一个 Order 对象写入 write-order.txt 文件。该文件内存的是二进制数据,文本编辑器内看到的将是乱码,不过隐约可以通过内容看到存储的 Order 对象。

���sr�cc.ermo.io.stream.output.OrderwZ����L�orderAmountt�Ljava/lang/Double;L�orderNot�Ljava/lang/String;L�	orderTypet�Ljava/lang/Integer;xpsr�java.lang.Double���J)k��D�valuexr�java.lang.Number��������xp@X�\(�t�O123sr�java.lang.Integer⠤���8�I�valuexq�~����

来看一个将对象集合写入文件的例子。

    public static void writeOrders(List<Order> orders) throws IOException {
        String filepath = "src/main/resources/write-orders.txt";
        try (ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(filepath)));) {
            out.writeObject(orders);
        }
    }

    public static void main(String[] args) throws Exception {
        Order o1 = new Order("O456", 1, 99.99);
        Order o2 = new Order("O789", 2, 88.88);
        writeOrders(Arrays.asList(o1, o2));
    }

ObjectOutputStreamwriteObject 方法同样支持集合类型,下一章我们将学习如何使用 ObjectInputStream