Java对象流详解:ObjectInputStream和ObjectOutputStream
在Java中,对象流是用于实现对象的序列化和反序列化的特殊流。对象流允许我们将对象的状态保存到文件中,或者通过网络传输到另一端,然后在另一端重建对象的状态。这是通过实现Serializable
接口来完成的。
对象流概述
对象流主要分为两类:
- 对象输入流:用于反序列化对象,即将字节数据转换回对象。
- 对象输出流:用于序列化对象,即将对象转换为字节数据。
对象输入流:ObjectInputStream
ObjectInputStream
是用于从字节输入流中读取字节数据,并将其转换回Java对象。
构造方法
// 使用InputStream构造ObjectInputStream
InputStream is = new FileInputStream("serializedObj.txt");
ObjectInputStream ois = new ObjectInputStream(is);
读取对象
try {ObjectInputStream ois = new ObjectInputStream(new FileInputStream("serializedObj.txt"));// 读取对象MyObject obj = (MyObject) ois.readObject();System.out.println("Object read: " + obj);
} catch (IOException | ClassNotFoundException e) {e.printStackTrace();
} finally {try {ois.close(); // 关闭流} catch (IOException e) {e.printStackTrace();}
}
对象输出流:ObjectOutputStream
ObjectOutputStream
是用于将Java对象转换为字节数据,并写入到字节输出流中。
构造方法
// 使用OutputStream构造ObjectOutputStream
OutputStream os = new FileOutputStream("serializedObj.txt");
ObjectOutputStream oos = new ObjectOutputStream(os);
写入对象
try {MyObject obj = new MyObject();// 序列化对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("serializedObj.txt"));oos.writeObject(obj);
} catch (IOException e) {e.printStackTrace();
} finally {try {oos.close(); // 关闭流} catch (IOException e) {e.printStackTrace();}
}
序列化和反序列化
为了使对象能够被序列化,对象的类必须实现Serializable
接口。这个接口是一个标记接口,不包含任何方法。一旦一个类实现了Serializable
接口,它的实例就可以被序列化和反序列化。
public class MyObject implements Serializable {private static final long serialVersionUID = 1L;// 类的其它成员和方法
}
注意事项
- 序列化ID:每个可序列化类都有一个
serialVersionUID
,用于验证序列化和反序列化过程中的版本兼容性。 - transient关键字:使用
transient
关键字声明的成员变量不会被序列化。 - 安全问题:序列化可能会引发安全问题,因为反序列化时可以创建任何对象。
结论
对象流是Java中处理对象序列化和反序列化的重要工具,它允许我们轻松地保存和恢复对象的状态。通过ObjectInputStream
和ObjectOutputStream
,我们可以在程序间传输对象,或者将对象保存到文件中。在实际编程中,合理使用对象流可以大大提高程序处理复杂数据的能力。通过上述示例和解释,你应该能够更好地理解和应用对象流。