Java IO类库之ObjectInputStream和ObjectOutPutStream

1、ObjectOutputStream

1 - ObjectOuputStream介绍

    ObjectOutputStream(对象字节输出流),用于将一个序列化对象写入到建立ObjectOutputStream时传入的底层字节输入流中,经过源码可知该类继承OutputStream的同时实现了ObjectOutput接口,而此接口继承了DataOut接口,所以ObjectOutputStream在具备DataOutputStream写入基础数据类型到底层字节流功能的同时也具备将对象、数组和字符串写入到底层字节输入流中的功能。java

ObjectOutputStream与DataOutputStream的区别:数组

1)ObjectOutputStream是将一个对象的全部属性、还有类信息的额外信息写入到底层字节输出流中,而DataOutputStream一次写入的只是一个基础类型数据网络

2)读取时ObjectOutputStream一次只读取一个对象不关心每一个对象属性的写入顺序,DataOutputStream须要严格按照写入顺序进行读取ide

2 - ObjectOutputSteam源码解析

1)经常使用成员方法源码分析

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 的基本数据。

2、ObjectInputStream

1 - ObjectInputStream介绍

    ObjectInputStream是对象字节输入流,继承自InputStream,用于从底层字节输入流中读取一个序列化对象到程序中,与ObjectOutputStream功能相对应,实现了ObjectInput接口,而ObjectInput实现了DataInput接口,在实现DataInput接口定义的基础类型数据的基础上扩展了读取对象、数组和字符串的功能。它能够和FileInputStream和FileOutStream将使用ObjectOutputStream持久化的对象、数组和字符串读取到程序中,并还原状态,固然还能够用于在网络中传输对象数据。spa

2 - ObjectInputStream源码分析

1)构造方法代理

public ObjectInputStream(InputStream in) throws IOException {
        verifySubclass();
        bin = new BlockDataInputStream(in);
        handles = new HandleTable(10);
        vlist = new ValidationList();
        serialFilter = ObjectInputFilter.Config.getSerialFilter();
        enableOverride = false;
        readStreamHeader();
        bin.setBlockDataMode(true);
    }

    protected ObjectInputStream() throws IOException, SecurityException {
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
        }
        bin = null;
        handles = null;
        vlist = null;
        serialFilter = ObjectInputFilter.Config.getSerialFilter();
        enableOverride = true;
    }

两个构造方法逻辑基本相同,不一样点在于ObjectInputStream是建立一个全新的字节流,而ObjectInputStream(InputStream in)的部分属性基于绑定的字节输入流incode

2)其余经常使用成员方法

int available(); //返回不受阻塞地读取的字节数
void close();//关闭输入流
void defaultReadObject();//从当前输入流读取当前类状态的属性(没有被static、transient修饰的字段)
protected boolean enabledResolveObject(boolean enable);//使流容许从该流读取的对象被替换
int read();//读取字节数据
int read(byte[] buf, int off, int len);//读入byte数组
boolean readBoolean();//读取一个boolean值
byte readByte();//读取一个8位字节
char readChar();//读取一个16位char值
...
String readUTF();//读取UTF-8格式的String
readFully(byte buf[])
readFully(byte buf[],int off,int len);//阻塞直至读取全部字节
ObjectInputStream.GetField readFields();//按名称从流中读取持久字段并使其可用
相关文章
相关标签/搜索