Java_io体系之ObjectInputStream、ObjectOutputStream简介、走进源码及示例――11(一)

2014-11-24 08:05:14 · 作者: · 浏览: 2

Java_io体系之ObjectInputStream、ObjectOutputStream简介、走进源码及示例――11


这对流也是有输入才有输出、觉得先理清输出更容易理清这对流。因为这两个类源码中牵扯到的东西较多、所以这里只列出常用方法、实例、而没有关键字和源码、有兴趣的可以自己再深入研究一下。


一:ObjectOutputStream


1、类功能简介:


对象字节输出流、将一个序列化的对象写入到构造ObjectOutputStream时传入的底层字节输出流中、通过源码可以看出、他虽然不是实现了FilterOutputStream装饰类、同时实现了ObjectOut、而此接口实现了DataOut接口、并且对这个接口进行了扩展、使得ObjectOut在具有DataOut中定义的各种方法同时、也具有将对象、数组、字符串写入到底层字节流中的功能、这样也就意味着ObjectOutputStream同样具有DataOutputStream功能的同时也具有将对象、数组字符串写入到底层字节输出流中的功能、当然ObjectOuputStream同样还实现了别的接口、因为他写入一个对象的时候、不仅仅写入的是标示这个Object的所有属性、同时还有额外的一些信息、比如版本号、作者等、但是这些对我们是透明的、具体的写入方法由JDK说了算、从这里也可以看出ObjectOutputStream与DataOutputStream之间的差异、1、ObjectOutputStream是将一个对象的所有相关属性、信息(不包括方法)写入到底层流中、而DataOutputStream一次写入的只是一个java基础类型的数据、2、读取的时候ObjectOutputStream一次读取一个对象、不必关心对象每个属性的写入顺序、而DataOutputStream读取时要严格按照写入时的顺序读取(当然、在使用skip方法时还要考虑字节数)、有关序列化的有另一篇文章说明、总结时候也会给出一点有关序列化的认识。


2、ObjectOutputStreamAPI简介:


A:构造方法

	protected  ObjectInputStream();		用于完全重新实现ObjectInputStream的子类的构造方法、使得子类可以拥有自己的私有关键字节、而不是使用ObjectInputStream自带的字节。 

	ObjectInputStream(InputStream in);		创建从指定 InputStream 读取的 ObjectInputStream。

B:一般方法

	protected  void annotateClass(Class
   cl);		子类可以实现此方法,从而允许在流中存储类数据。
	
	protected  void annotateProxyClass(Class
   cl);	子类可以实现此方法,从而在流中存储定制数据和动态代理类的描述符。 
	 
	void close();		关闭当前流、释放所有与此流有关的资源。 
	 
    void defaultWriteObject(); 		将表示当前类状态的属性写入到构造时传入的底层流out中。 
    
    protected  void drain();	将ObjectOutputStream 中的所有已缓冲数据写入到底层流中、注意:但是不flush底层流、 
    
    protected  boolean enableReplaceObject(boolean enable);		允许流对流中的对象进行替换。 
    
    void flush();	 刷新该流的缓冲、这里也会将底层流中的数据flush到底层流指定的目的地中。 

    ObjectOutputStream.PutField putFields();	获取用于缓冲写入流中的持久存储字段的对象。 
    
    protected  Object replaceObject(Object obj); 在序列化期间,此方法允许 ObjectOutputStream 的受信任子类使用一个对象替代另一个对象。 
    
    void reset();	重置将丢弃已写入流中的所有对象的状态。 

    void write(byte[] buf);		写入一个 byte 数组。 

    void write(byte[] buf, int off, int len);		写入字节的子数组。 

    void write(int val);		写入一个字节。 

    void writeBoolean(boolean val);		写入一个 boolean 值。 

    void writeByte(int val);		写入一个 8 位字节。 

    void writeBytes(String str);		以字节序列形式写入一个 String。 

    void writeChar(int val);		写入一个 16 位的 char 值。 

    void writeChars(String str);		以 char 序列形式写入一个 String。 

    protected  void writeClassDescriptor(ObjectStreamClass desc);		将指定的类描述符写入 ObjectOutputStream。 

    void writeDouble(double val);		写入一个 64 位的 double 值。 

    void writeFields();		将已缓冲的字段写入流中。 

    void writeFloat(float val);		写入一个 32 位的 float 值。 

    void writeInt(int val);		写入一个 32 位的 int 值。 

    void writeLong(long val);		写入一个 64 位的 long 值。 

    void writeObject(Object obj);		将指定的对象写入 ObjectOutputStream。 

    protected  void writeObjectOverride(Object obj);		子类用于重写默认 writeObject 方法的方法。 

    void writeShort(int val);		写入一个 16 位的 short 值。 

    protected  void writeStreamHeader();		提供 writeStreamHeader 方法,这样子类可以将其自身的头部添加或预加到流中。 

    void writeUnshared(Object obj);		 将“未共享”对象写入 ObjectOutputStream。 

    void writeUTF(String str);		以 UTF-8 修改版格式写入此 String 的基本数据。 



4、实例演示:


与ObjectInputStream放在一起、仅针对写入对象进行操作、其他的写入基本类型的方法与DataOuputStream相似。

二:ObjectInputStream


1、类功能简介:


对象字节输入流、将一个序列化的对象通过底层字节输入流读取到程序中、与ObjectOutputStream相对应、实现了ObjectOut接口、而ObjectOut接口实现了DataOut接口、在DataOut接口定义的基础上扩展了读取对象、数组、字符串的功能、作为ObjectOut的实现类ObjectInputStream、它可以将使用ObjectOutputStrea