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"实例也将关闭。