java IO流及装饰模式.ppt

JAVA I/O RandAccessFile类 特点: 1:该对象即可读取,又可写入。 2:该对象中的定义了一个大型的byte数组,通过定义指针来操作这个数组。 3:可以通过该对象的getFilePointer()获取指针的位置,通过seek()方法设置指针的位置。 4:该对象操作的源和目的必须是文件。? 5:其实该对象内部封装了字节读取流和字节写入流。 注意:实现随机访问,最好是数据有规律。 JAVA I/O 序列化和反序列化 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象,序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将字节转换为对象。这两个过程结合起来,可以轻松地存储和传输数据,其目的有: 1 以某种存储形式使自定义对象持久化; 2、将对象从一个地方传递到另一个地方。 3、使程序更具维护性。 Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。 JAVA I/O 序列化和反序列化 如何序列化一个对象 一个对象能够序列化的前提是实现Serializable或者Externalizable接口,Serializable接口没有方法,更像是个标记(Marker Interface)。有了这个标记的Class就能被序列化机制处理。API讲解Serializable(方法重要) 理论 需要注意的是Externalizable接口继承自Serializable接口。他们的区别是什么( Externalizable几乎用不到,了解) JAVA I/O 序列化和反序列化 仅仅实现Serializable接口的类可应采用默认的序列化方式。比如String类。 假设有一个Customer类的对象需要序列化,如果这个类仅仅实现了这个接口,那么序列化和反序列化的方式如下:Object OutputStream采用默认的序列化方式,对于这个类的非static,非transient的实例变量进行序列化。Object InputStream采用默认的反序列化方式,对于这个类的非static,非transient的实例变量进行反序列化 如果这个类不仅实现了Serializable接口,而且定义了readObject(Object InputStream in)和 writeObject(Object OutputStream out)方法,那么将按照如下的方式进行序列化和反序列化:Object OutputStream会调用这个类的writeObject方法进行序列化,Object InputStream会调用相应的readObject方法进行反序列化。 实现Externalizable接口的类完全由自身来控制序列化的行为。而且必须实现writeExternal(Object Output out)和readExternal(Object Input in)。那么将按照如下的方式进行序列化和反序列化:ObjectOutputStream会调用这个类的writeExternal方法进行序列化,ObjectInputStream会调用相应readExternal方法进行反序列化。 JAVA I/O 序列化和反序列化的特点 假设一个被序列化的对象引用了其他对象,同样,其他对象又引用了更多的对象。这一系列的对象和它们的关系形成了一个顺序图表,他们都能被序列化和反序列化。 当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。 如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。 如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列 总结 transient的变量不被序列化工具存储。同样,static变量也不被存储 JAVA I/O 序列化和反序列化 JDK类库中的序列化API java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一

文档评论(0)

1亿VIP精品文档

相关文档