Java IO类库之ObjectInputStream和ObjectOutPutStream

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

一、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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是覆盖索引?如何利用覆盖索引进行SQL语句优化?

如果你不知道什么是覆盖索引&#xff0c;那么SQL性能优化便无从谈起&#xff01; 什么是覆盖索引?如何利用索引进行SQL语句优化&#xff1f; 表结构 150多万的数据&#xff0c;这么一个简单的语句&#xff1a; 慢查询日志里居然很多用了1秒的&#xff0c;Explain的结果是&am…

ARM的商业模式是如何炼成的?

导读&#xff1a;保守、严谨&#xff0c;又有一些皇族气质&#xff0c;作为一家拥有纯正英国血统的公司&#xff0c;ARM看似呆板的作风却让其在移动互联网大潮中势如破竹&#xff0c;没有对手。也许过于看重产业链伙伴的声音&#xff0c;导致ARM的决策有些迟缓&#xff0c;比如…

java 将一段时间分割为两个连续的时间

eg: 20180901 -- 20180930 ->>>> 20180901-20180915 && 20180916-20180930 /*** 获取两日期相差天数** param beginDateStr 时间起点* param endDateStr 时间终点* param TimeType 时间类型 yyyy-MM-dd || yyyyMMdd || ....* return long /天数*/public …

java 中 FtpClient 实现 FTP 文件上传、下载

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 源代码大部分是网上找的&#xff0c;查来查去&#xff0c;找到几个可以用的例子&#xff0c;改来改去&#xff0c;揉合成现在这个样子。…

MongDB集合文档操作符

一、MongoDB - 连接1.启动 MongoDB 服务只需要在 MongoDB 安装目录的 bin 目录下执行 mongod 即可执行启动操作后&#xff0c;mongodb 在输出一些必要信息后不会输出任何信息&#xff0c;之后就等待连接的建立&#xff0c;当连接被建立后&#xff0c;就会开始打印日志信息。可以…

LIMIT M,N分页性能优化方案

利用子查询优化 说明: MySQL 并不是跳过 offset 行&#xff0c;而是取 offsetN 行&#xff0c;然后返回放弃前 offset 行&#xff0c;返回 N 行&#xff0c;那当 offset 特别大的时候&#xff0c;此时使用limit m,n效率就非常的低下。想要提升性能要么控制返回的总页数&#…

PHP获取文件后缀名

PHP获取文件后缀名是PHP学习者常见的一种操作&#xff0c;无论是在面试过程中还是PHP新手自学中。PHP获取文件后缀名都是很普遍的需要掌握的一个知识点。下面我们就给大家总结介绍PHP获取文件扩展名也就是后缀名的两种方法&#xff01;一、通过pathinfo首先大家应该知道pathinf…

Web Service 简单实例(java 版本) ,IDE自动生成客户端代码方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、客户端工程 jar 包 &#xff1a; 二、1. 服务端&#xff1a;( new 一个web service project ) package com;import javax.jws.…

最佳Linux服务器发行版

一款Linux发行版就如同一件衣服一样&#xff0c;适合自己的才是最好的选择。 对大型企业而言&#xff0c;当然首选Red Hat Enterprise Linux&#xff08;RHEL&#xff09;。Red Hat有完善的技术支持服务&#xff0c;而且在我们周围&#xff0c;非常容易找到持有Red Hat认证的技…

在线代码编辑器 Codemirror 的轻量级 React 组件

代码编辑器 CodeMirror 的轻量级 React 组件 demo uiw-react.github.io/react-codem… 特性: ? 自动根据 mode 配置加载 mode 文件。 ? 快速简单的配置 API。 安装 npm install uiw/react-codemirror --save 复制代码使用 import CodeMirror from uiw/react-codemirror; impo…

「机械」4大传动方式优劣对比:机械、电气、气压、液压

传动方式有很多种。目前应用比较多的四大类传动方式&#xff08;机械、电气、液压和气压&#xff09;中&#xff0c;没有一种动力传动是十全十美的。今天跟大家分享4种传动方式的优劣对比。 一. 机械传动 1. 齿轮传动 齿轮传动是机械传动中应用最广的一种传动形式。它的传动比较…

一次性获取多个oracle序列的值,实现关联表多数据的批量insert

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 业务 要求批量导入不小于10W条数据到 user 表&#xff0c;但是user表在 insert 每条数据的同时要 insert 一条对应数据到 customer表…

开始使用C++11的9个理由

如果你的代码工作正常并且表现良好&#xff0c;你可能会想知道为什么还要使用C 11。当然了&#xff0c;使用用最新的技术感觉很好&#xff0c;但是事实上它是否值得呢&#xff1f; 在我看来&#xff0c;答案毫无疑问是肯定的。我在下面给出了9个理由&#xff0c;它们分为两类&a…

MySQL批量update数据(更新的数据值不同)

(一)纯mysql: ​UPDATE my_table SETstatus CASE idWHEN 1 THEN 3WHEN 2 THEN 4WHEN 3 THEN 5END,title CASE idWHEN 1 THEN New Title 1WHEN 2 THEN New Title 2WHEN 3 THEN New Title 3END WHERE id IN (1,2,3) (二)mybatis写法 1:foreach <update id"batchUpd…

webpack+vue-cli 中proxyTable配置接口地址代理

在项目开发的时候&#xff0c;接口联调的时候一般都是同域名下&#xff0c;且不存在跨域的情况下进行接口联调&#xff0c;但是当我们现在使用vue-cli进行项目打包的时候&#xff0c;我们在本地启动服务器后&#xff0c;比如本地开发服务下是 http://localhost:8080 这样的访问…

AMQP 协议介绍

RabbitMQ 是遵从AMQP 协议的&#xff0c; 换句话说&#xff0c; RabbitMQ 就是AMQP 协议的Erlang 的实现(当然RabbitMQ 还支持STOMP2 、MQTT3 等协议) 0 AMQP 的模型架构和RabbitMQ 的模型架构是一样的&#xff0c;生产者将消息发送给交换器&#xff0c;交换器和队列绑定。当生…

关联表多数据的批量insert (批量导入,测试19W条数据用时46秒)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、业务需求 &#xff1a;作多个批量导入 &#xff0c;根据业务不同&#xff0c;每条数据导入前作各种验证&#xff0c; 导入后提示验证…

Java已死?九百万程序员说不

Java没死&#xff0c;事实上它拥有足够的能量让你的应用跑起来。那些对Java吹毛求疵人频繁地聚焦在一些小众问题上&#xff0c;总是和其他技术或者语言做些不公平的对比&#xff0c;这些语言并没有像Java一样得到广泛应用及长远的历史。 现在的小孩都能学Java&#xff0c;它在…

Linux SSH远程管理故障如何排查?

SSH远程管理故障排查方案&#xff1a;1、检测两个机器是否畅通两个机器之间是否畅通&#xff0c;查看物理链路是否有问题(网线网卡、IP是否正确)第1步&#xff1a;物理链路是否畅通&#xff0c;比喻为“高速公路是否畅通”ping 排查客户端到服务端的线路问题&#xff0c;ping是…