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 中 FtpClient 实现 FTP 文件上传、下载

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

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认证的技…

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

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

AMQP 协议介绍

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

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

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

CSS中position的absolute和relative用法

static: HTML元素的默认定位方式absolute: 将对象从文档流中拖出&#xff0c;使用left&#xff0c;right&#xff0c;top&#xff0c;bottom等属性进行绝对定位。而其层叠通过z-index属性定义。绝对定位的元素的位置相对于最近的已定位父元素&#xff0c;如果元素没有已定位的父…

避免流量高峰期CDN问题的10个方法

在视频流媒体中&#xff0c;因平台火爆而出现问题是件好事。至少&#xff0c;这比根本没有观众要好。\\也许你正在使用世界级的CDN&#xff0c;但是&#xff0c;在大型赛事期间&#xff0c;当CDN的服务器和对等点流量变得饱和的时候&#xff0c;一些用户还是无法享受到流畅的体…

Android应用进入爆发期 手机游戏仍是市场重心

近日&#xff0c;91无线发布了《91无线移动应用发展趋势报告&#xff08;Android版&#xff09;》。报告显示&#xff0c;2012年&#xff0c;无论Android移动应用用户下载还是开发者研发均呈爆发态势&#xff0c;手机游戏仍是市场重心所在。同时&#xff0c;Android移动应用下载…

WebService中文件传输

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 WebService处理传递普通的信息&#xff0c;还可以传输文件&#xff0c;下面介绍WebService是怎么完成文件传输的。 1、 首先编写服务器端…

Django框架-Form组件

一、DjangoForm组件介绍 我们之前在html页面中利用form表单向后端提交数据时&#xff0c;都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验&#xff0c;比如验证用户是否输入&#xff0c;输入的长度和格式等是否正…

主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间=k的个数)...

取板粗 好东西来的 1.&#xff08;HDOJ2665&#xff09;http://acm.hdu.edu.cn/showproblem.php?pid2665 &#xff08;POJ2104&#xff09;http://poj.org/problem?id2104 &#xff08;POJ2761&#xff09;http://poj.org/problem?id2761 题意&#xff1a;求区间第K大&…

分享Spring Cloud分布式微服务架构图

分布式、微服务、云架构JAVA语言开发、跨平台、高性能、高可用、安全、服务化、模块化、组件化、驱动式开发模式 从现在开始&#xff0c;我这边会将近期研发的springcloud微服务云架构的搭建过程和精髓记录下来&#xff0c;帮助更多有兴趣研发spring cloud框架的朋友&#xff0…

Lyft Level 5 Challenge 2018 - Elimination Round翻车记

打猝死场感觉非常作死。 A&#xff1a;判一下起点和终点是否在其两侧即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() {int x0,…

mysql用户的权限分配

2019独角兽企业重金招聘Python工程师标准>>> 因今天在分配数据库权限的时候&#xff0c;同事反映账户不能使用函数&#xff0c;遂搜集资料总结了一番关于mysql用户的权限分配。 MySQL 赋予用户权限命令的简单格式可概括为&#xff1a; grant 权限 on 数据库对象 to …

小米360口水战背后:国产手机第三态诞生

摘要&#xff1a;按照双方公布的配置信息&#xff0c;小米手机青春版为1.2G H z双核处理器&#xff0c;华为闪耀为1G H z双核。种向市场投入海量推广资金&#xff0c;以换取产品上的高利润&#xff0c;代表为步步高、金立、O PPO。南都制图&#xff1a;宋小伟 互联网入侵通信业…

线段与多边形的关系

转自周见智 介绍 最近项目中要用到有关几何&#xff08;Geometry&#xff09;方面的知识&#xff0c;程序需要判断给定的一条线段&#xff08;Segment&#xff09;与指定多边形&#xff08;Polygon&#xff09;的位置关系。这种关系分为三种&#xff1a;多边形包含线段、多边形…