山东省住房和城乡建设局网站首页,淘宝网上购物平台,安徽运营网络营销推荐咨询,啥是东莞网站优化推广2019独角兽企业重金招聘Python工程师标准 一、ObjectOutputStream 1 - ObjectOuputStream介绍 ObjectOutputStream(对象字节输出流)#xff0c;用于将一个序列化对象写入到创建ObjectOutputStream时传入的底层字节输入流中#xff0c;通过源码可知该类继承Outp… 2019独角兽企业重金招聘Python工程师标准 一、ObjectOutputStream 1 - ObjectOuputStream介绍 ObjectOutputStream(对象字节输出流)用于将一个序列化对象写入到创建ObjectOutputStream时传入的底层字节输入流中通过源码可知该类继承OutputStream的同时实现了ObjectOutput接口而此接口继承了DataOut接口因此ObjectOutputStream在具有DataOutputStream写入基础数据类型到底层字节流功能的同时也具有将对象、数组和字符串写入到底层字节输入流中的功能。 ObjectOutputStream与DataOutputStream的区别 1ObjectOutputStream是将一个对象的所有属性、还有类信息的额外信息写入到底层字节输出流中而DataOutputStream一次写入的只是一个基础类型数据 2读取时ObjectOutputStream一次只读取一个对象不关心每个对象属性的写入顺序DataOutputStream需要严格按照写入顺序进行读取 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 的基本数据。 二、ObjectInputStream 1 - ObjectInputStream介绍 ObjectInputStream是对象字节输入流继承自InputStream用于从底层字节输入流中读取一个序列化对象到程序中与ObjectOutputStream功能相对应实现了ObjectInput接口而ObjectInput实现了DataInput接口在实现DataInput接口定义的基础类型数据的基础上扩展了读取对象、数组和字符串的功能。它可以和FileInputStream和FileOutStream将使用ObjectOutputStream持久化的对象、数组和字符串读取到程序中并还原状态当然还可以用于在网络中传输对象数据。 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)的部分属性基于绑定的字节输入流in 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();//按名称从流中读取持久字段并使其可用转载于:https://my.oschina.net/zhangyq1991/blog/1860710