提示
Java IO ObjectOutputStream 使用示例。@ermo
# ObjectOutputStream 使用示例
前面章节我们使用 DataOutputStream 和 DataInputStream 完成了将对象写入文件和读入内存的操作。但是这种操作有很多局限性,使用起来开发成本比较高。程序员在开发的过程中不仅需要关注读写的顺序,还要针对对象内不同类型的字段使用不同的写和读方法。
本章学习的 ObjectOutputStream 和 ObjectInputStream 可以更快地完成对象的读写过程。
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));
    }
ObjectOutputStream 的 writeObject 方法同样支持集合类型,下一章我们将学习如何使用 ObjectInputStream。