2019独角兽企业重金招聘Python工程师标准>>>

一、ObjectOutputStream

1 - ObjectOuputStream介绍

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

ObjectOutputStream与DataOutputStream的区别:

1)ObjectOutputStream是将一个对象的所有属性、还有类信息的额外信息写入到底层字节输出流中,而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

Java IO类库之ObjectInputStream和ObjectOutPutStream相关推荐

  1. Java IO: 序列化与ObjectInputStream、ObjectOutputStream

    转载自  Java IO: 序列化与ObjectInputStream.ObjectOutputStream 作者:Jakob Jenkov  译者: 李璟(jlee381344197@gmail.c ...

  2. Java IO框架总揽--ObjectInputStream ObjectOutputStream源码解读

    ObjectInputStream与ObjectOutputStream的作用是:对基本数据和对象进行序列化操作进行支持.其中ObjectInputStream对象提供对基本数据和对象对持久存储,当我 ...

  3. java io类库,Java利用io类库对各种文件的操作详解

    Java中文网 - Java利用io类库对各种文件的操作详解 java中提供了io类库,可以轻松的用java实现对文件的各种操作.下面就来说一下如何用java来实现这些操作. 新建目录 //Strin ...

  4. Java IO类库之CharArrayWriter

    2019独角兽企业重金招聘Python工程师标准>>> 一.CharArrayWriter的介绍 CharWriter继承自java.io.Writer,内部实现了一个可用于保存写入 ...

  5. Java IO类库之管道流PipeInputStream与PipeOutputStream

    2019独角兽企业重金招聘Python工程师标准>>> 一.java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedO ...

  6. Java 流中关于ObjectInputStream 和ObjectOutputStream 的陷进

    当用在网络中时,如oos = new ObjectOutputStream(map.get(clientName).getOutputStream()); 当一个out或者一个input创建时,连接方 ...

  7. 学习韩顺平老师java io 笔记整理

    一.文件 文件流 文件在程序中以留的形式来操作的 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nXoI6Vnc-1642335857608)(F:\人生苦短,我用IO ...

  8. Java基础——Java IO详解

    一.概述 1.Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要 ...

  9. java.io.StreamCorruptedException: invalid type code: AC错误的解决方法

    问题描述: 在向一个文件写入可序列化对象时,每次只想向文件的末尾添加一个可序列化的对象,于是使用了FileOutputStream(文件名,true)间接的构建了ObjectOutputStream流 ...

最新文章

  1. spring 声明式事务
  2. delphi 入门教程
  3. 皮一皮:所以说,快乐水才会让人变胖...
  4. HDU5320 : Fan Li
  5. Linux之eval命令使用
  6. Starting MySQL.... ERROR! The server quit without updating PID file
  7. javascript6
  8. 电脑知识:磁盘分区相关知识笔记!
  9. (网页)js每隔5分钟执行一次ajax请求的实现方法(转)
  10. but was actually of type [com.sun.proxy.$Proxy13]
  11. RequestInfo关键点解析
  12. 2022年上半年软件设计师上午真题及答案解析
  13. php 判断是否是拼音,php汉字转拼音的示例
  14. 分治策略-股票获取最大收益-最大子数组问题
  15. 1叉叉加速器分析_加速分析
  16. VMware Workstation虚拟机环境下Xubuntu系统如何添加中文输入法
  17. 高德地图Amap常用功能总结
  18. pion demo运行
  19. 操作系统实验二——时间片轮转调度算法(RR算法)(新进程放队首和队尾两种C++实现)
  20. 全网首发:relocation R_X86_64_PC32 against symbol can not be used when making a shared object recompile

热门文章

  1. multi source replication mysql_MySQL 5.7多源复制(Multi-Source Replication)
  2. 事务没提交的数据查的出来吗?_“金三银四”面试官:说说事务的ACID,什么是脏读、幻读?...
  3. 王道考研 计算机网络17 IP数据报 最大传送单元MTU IP地址 IPv4 子网划分 ARP协议 ICMP协议 移动IP
  4. Redis Mac下安装与使用
  5. Bash脚本:怎样一行行地读文件(最好和最坏的方法)
  6. 企业贡献开源,其背后的战略动机是什么?
  7. 考驾照重点科目的关键考试技巧
  8. 优质的程序员需为代码效率而呕心沥血
  9. FFMPEG的详细资料可以在它的官方网站上找到
  10. H.264/AVC 标准中CAVLC 和CABAC 熵编码算法研究