Java IO:ObjectOutputStream

时间:2020-01-09 10:36:04  来源:igfitidea点击:

JavaObjectOutputStream类(java.io.ObjectOutputStream)使我们可以将Java对象而不是仅原始字节写入到OutputStream中。我们将OutputStream包装在ObjectOutputStream中,然后可以向其写入对象。

JavaObjectOutputStream通常与JavaObjectInputStream一起使用。 " ObjectOutputStream"用于编写Java对象,而" ObjectInputStream"用于再次读取对象。稍后我们将看到一个示例。

ObjectOutputStream示例

这是一个JavaObjectOutputStream示例:

ObjectOutputStream objectOutputStream = 
    new ObjectOutputStream(new FileOutputStream("object.data"));

MyClass object = new MyClass();

output.writeObject(object);

output.close();

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

在可以序列化和反序列化对象之前,对象的类必须实现java.io.Serializable。有关更多信息,请参见Java Serializable。

将ObjectOutputStream与ObjectInputStream一起使用

我之前曾答应向我们展示一个将JavaObjectOutputStreamObjectInputStream结合使用的示例。这是一个例子:

import java.io.*;

public class ObjectInputStreamExample {

    public static class Person implements Serializable {
        public String name = null;
        public int    age  =   0;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        ObjectOutputStream objectOutputStream =
            new ObjectOutputStream(new FileOutputStream("data/person.bin"));

        Person person = new Person();
        person.name = "Hyman";
        person.age  = 40;

        objectOutputStream.writeObject(person);
        objectOutputStream.close();

        ObjectInputStream objectInputStream =
            new ObjectInputStream(new FileInputStream("data/person.bin"));

        Person personRead = (Person) objectInputStream.readObject();

        objectInputStream.close();

        System.out.println(personRead.name);
        System.out.println(personRead.age);
    }
}

这个例子首先创建一个连接到FileOutputStream的ObjectOutputStream。然后,它创建一个" Person"对象并将其写入" ObjectOutputStream",然后关闭" ObjectOutputStream"。

然后,该示例创建一个" ObjectInputStream",该对象连接到" ObjectOutputStream"所连接到的同一文件。然后,该示例从ObjectInputStream中读取一个对象,并将其强制转换为Person对象。之后,也关闭了" ObjectInputStream",并将读入" Person"对象的值打印到" System.out"。

运行此示例输出的输出应为:

Hyman
40

关闭一个ObjectOutputStream

完成将数据写入" ObjectOutputStream"后,我们应该记住将其关闭。关闭" ObjectOutputStream"也会关闭" ObjectOutputStream"正在写入的" OutputStream"实例。

通过调用对象的close()方法来关闭ObjectOutputStream。这是关闭ObjectOutputStream的样子:

objectOutputStream.close();

我们还可以使用Java 7中引入的try-with-resources构造。这是如何使用try-with-resources构造使用和关闭" ObjectOutputStream"外观的方法:

OutputStream output = new FileOutputStream("data/data.bin");

try(ObjectOutputStream objectOutputStream =
    new ObjectOutputStream(output)){

    Person person = new Person();
    person.name = "Hyman";
    person.age  = 40;
    
    objectOutputStream.writeObject(person);
}

请注意,不再有任何显式的close()方法调用。 try-with-resources构造可以解决这一问题。

还要注意,第一个FileOutputStream实例不是在try-with-resources块内创建的。这意味着try-with-resources块不会自动关闭此FileOutputStream实例。但是,当关闭" ObjectOutputStream"时,它也会同时关闭写入的" OutputStream"实例,因此当" ObjectOutputStream"关闭时," FileOutputStream"实例也将关闭。