ObjectOutputStream(对象字节输出流),用于将一个序列化对象写入到建立ObjectOutputStream时传入的底层字节输入流中,经过源码可知该类继承OutputStream的同时实现了ObjectOutput接口,而此接口继承了DataOut接口,所以ObjectOutputStream在具备DataOutputStream写入基础数据类型到底层字节流功能的同时也具备将对象、数组和字符串写入到底层字节输入流中的功能。java
ObjectOutputStream与DataOutputStream的区别:数组
1)ObjectOutputStream是将一个对象的全部属性、还有类信息的额外信息写入到底层字节输出流中,而DataOutputStream一次写入的只是一个基础类型数据网络
2)读取时ObjectOutputStream一次只读取一个对象不关心每一个对象属性的写入顺序,DataOutputStream须要严格按照写入顺序进行读取ide
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 的基本数据。
ObjectInputStream是对象字节输入流,继承自InputStream,用于从底层字节输入流中读取一个序列化对象到程序中,与ObjectOutputStream功能相对应,实现了ObjectInput接口,而ObjectInput实现了DataInput接口,在实现DataInput接口定义的基础类型数据的基础上扩展了读取对象、数组和字符串的功能。它能够和FileInputStream和FileOutStream将使用ObjectOutputStream持久化的对象、数组和字符串读取到程序中,并还原状态,固然还能够用于在网络中传输对象数据。spa
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
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();//按名称从流中读取持久字段并使其可用