Java IO:ObjectOutputStream
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一起使用
我之前曾答应向我们展示一个将JavaObjectOutputStream与ObjectInputStream结合使用的示例。这是一个例子:
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"实例也将关闭。

