[五] JavaIO之InputStream OutputStream简介 方法列表说明

InputStream 和 OutputStream 对于字节流的输入和输出
是作为协议的存在
所以有必要了解下这两个类提供出来的基本约定
这两个类是抽象类,而且基本上没什么实现,都是依赖于子类具体的去实现
但是他是对于其子类 协议纲领一般的存在
了解清楚每一个方法含义,对于后续具体的子类将会有非常大的帮助

基本含义

InputStream 所有字节输入流的 超类 他是一个抽象类
OutputStream 所有字节输出流的 超类 他是一个抽象类

方法列表

image_5b95f27e_7902
InputStream  包含了读取方法以及辅助方法
OutputStream包含了写入方法以及辅助方法

方法对照

read()
read(byte[])
read(byte[], int, int)
write(byte[])
write(byte[], int, int)
write(int)
close close
 flush()
available()
mark(int)
markSupported()
reset()
skip(long)

方法详解

read
read()  从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值
如果因为已经到达流末尾而没有可用的字节,则返回值 -1
方法将会一直阻塞,直到数据可用,检测到流的末尾或者抛出异常
无参数的read() 是抽象方法,由实现类提供实现
三个read方法实际上根本方法都是read()方法
其他两个方法为拓展功能,逻辑便捷方法
无参数的read()返回的数据为读取到的字节值
而有参数的则是读取到字节数组中,所以返回值为读取到的个数
read方法关键点
要么就是直接返回读取的字节
要么就是将读取到的字节放入字节数组中,字节数组是你传递进去的
image_5b95f27f_7672
write
write(int b)
将指定的字节写入此输出流
write 的常规协定是:向输出流写入一个字节, 要写入的字节是参数 b 的八个低位   b 的 24 个高位将被忽略
说白了就是写入的是byte虽然参数是int
write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流
write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同
write(byte[] b,int off,int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
write(b, off, len) 的常规协定是:将数组 b 中的某些字节按顺序写入输出流;
元素 b[off] 是此操作写入的第一个字节,b[off+len-1] 是此操作写入的最后一个字节
类似read的调用形式
直接写入指定字节的write(int b)  方法是根本
其他的是拓展功能
image_5b95f27f_28a4
read()  与write(int b) 是根本的读取一个字节或者写入一个字节的方法
其余形式是针对传入字节数组作为参数,以及指定字节数组的偏移量时的一些拓展功能
一旦传递了字节数组作为参数
read将会读取数据到字节数组
write将会将字节数组的数据写入
close
都需要关闭流,所以都有close方法
都是关闭流并释放与此流有关的系统资源
都可能抛出IOException
在InputStream和OutputStream中,两个close方法都是空方法

flush
flush的含义为刷新,在写入数据时使用
所以,只有输出流拥有flush方法
之所以需要刷新,是因为有的输出流的写方法实现,可能已经缓冲了以前写入的任何字节
那么,这个方法用于提供能够立即将数据写入到磁盘的功能
不过,只是立即请求操作系统进行处理,而不保证这些字节实际已经写入到物理设备,比如磁盘
下面几个为InputStream独有
public int available()  throws IOException  
返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数
这句话有些绕口,直白的说就是:
在方法调用前,可以获取到这个流中可用的字节数目
假设说有N个字节可以使用,显然你应该很可能读取到N个字节,或者能够跳过N个字节
一次读取或跳过此估计数个字节不会受阻塞
注意:
这个数目是一个预估的数量
实际的读取或者跳过的字节数可能小于这个数
InputStream中的这个方法总是返回0 
所以这个方法能否使用依赖于子类的实现

image_5b95f27f_373b
public long skip(long n) throws IOException
返回的是实际跳过的字节数
在内部创建一个 byte 数组,然后重复将字节读入其中,直到读够 n 个字节或已到达流末尾为止
image_5b95f27f_6cd7
reset()
mark(int)
markSupported() 
三个方法是对于同一个功能点的不同方法  ,可以解决重复读的问题
mark(int)用来在此输入流中做标记,标记当前位置  打一个书签
markSupported()   测试此输入流是否支持 mark 和 reset 方法
reset()  将此流重新定位到最后一次对此输入流调用 mark 方法时的位置   回到书签
看下类中的默认代码可以发现:
默认情况下mark什么都不做
markSupported直接返回false
reset方法的调用会抛出异常
image_5b95f27f_26c1
mark的参数用于告知输入流在标记位置失效之前允许读取的字节数
标记已关闭的流对其无效
说起来很迷惑,用起来却很简单
比如
xxxStream.mark(50);//表明系统至少应该缓冲50以上个数据,以保证可以回来重新读取
xxxStream.read();
.....
xxxStream.read();

xxxStream.reset();//reset之后,读取到的数据将会和刚才调用mark 方法后read的数据是相同的
xxxStream.read();
.....
xxxStream.read();
如果方法 markSupported 返回 true,那么输入流总是在调用 mark 之后记录所有读取的字节
并时刻准备在调用方法 reset 时(无论何时),再次提供这些相同的字节
但是,如果在调用 reset 之前可以从流中读取多于 readlimit 的字节,则不需要该流记录任何数据

转载于:https://www.cnblogs.com/noteless/p/9618521.html

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

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

相关文章

[转]资本经营董事长班告诉你:不只企业有商业模式,个人商业价值更重要

本文转自:http://blog.sina.com.cn/s/blog_181b5b47e0102xz4v.html 东方财智-资本经营董事长班>>> 经营者如何轻松驾驭金融工具为企业发展加速、升级互联网工具实现品牌营销裂变、利用管理工具优化公司内部结构,把握前沿视角,实现快…

CPR认证-建材CE认证-305/2011/EU

建材CPR认证 - Regulation (EU) No 305/2011  2011年3月,欧盟颁布了新建筑产品法规RETULATION (EU) No 305/2011 – CPR,并通告了新法规于2013年7月进入强制执行,取代了老CPD指令89/106/EEC。  新的建材CPR认证也是…

python支持复数类型以下什么说法是错误的,【Python】专项练习题(1)

1.python代码如下:foo [1,2]foo1 foofoo.append(3)A.foo 值为[1,2]B.foo 值为[1,2,3]C.foo1 值为[1,2]D.foo1 值为[1,2,3]答案:B D链接:https://www.nowcoder.com/profile/153165401/myFollowings/detail/20055659来源:牛客网2.下列程序打印…

ios如何获取gps坐标(定位第二节)

原文连接: https://blog.csdn.net/michael_ouyang/article/details/54378338 -------------------------------------------------------------------- 在上一篇文章,解决ios 10不能定位的问题,把navigator.geolocation.getCurrentPosition…

java并发编程——线程池的工作原理与源码解读

2019独角兽企业重金招聘Python工程师标准>>> 线程池的简单介绍 基于多核CPU的发展,使得多线程开发日趋流行。然而线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以就引入了线程池技术,避免频繁的线…

电驴更新地址

emule是通过ED2K网络和KAD网络寻找、连接其他emule客户端的,所以服务器列表和KAD节点文件是emule的必需文件。 有些新手由于下载官方原版emule压缩包或其他未集成这些必需文件的emule压缩包,从而出现“连接不上ED2K与KAD”问题。所以学会下载更新服务器…

IOS内购详解

介绍 最近开发的一款APP上架被驳回了,理由是: 上架的APP是培训类,里面金牌视频课程需要购买,Android端使用支付宝,微信支付。 苹果规定 数字化内容、App功能以及服务等,需要使用内购 真实世界中的服务(…

汇编中的函数调用与递归

栈帧的结构 倘若我们要想搞清楚过程的实现,就必须先知道栈帧的结构是如何构成的。栈帧其实可以认为是程序栈的一段,而程序栈又是存储器的一段,因此栈帧说到底还是存储器的一段。那么既然是一段,肯定有两个端点,这个不需…

Redmine数据库备份及搬家

Bitnami Redmine的备份分2种方式: 1.导出数据库 2.整个目录搬家 不管是哪种都想停掉服务,redmine相关的服务有以下5个: redmineApache   redmineMySQL   redmineSubversion   redmineThin1   redmineThin2 可以打开windows服务控制面…

Redmine项目管理工具安装

Redmine免费开源的项目管理工具 下载 一键安装工具 https://bitnami.com/stack/redmine/installer 安装 Redmine一键安装工具集成了php服务,mysql服务。尽管安装就好。 安装完成后,在开始菜单,找到-----Bitnami Redmine Stack--------Bi…

方便微信公众号等手机网页调试插件eruda和vConsole

原文地址&#xff1a;https://blog.csdn.net/qq_39234840/article/details/80951710 ---------------------------------------------------------- 调试插件一&#xff1a;eruda&#xff08;推荐&#xff0c;因为比vConsole功能多&#xff09; <script src"//cdn.js…

WebServiceStudio.exe测试webservice接口工具

WebServiceStudio.exe测试webservice接口工具 下载链接 https://pan.baidu.com/s/1gf8ajS3 打开工具WebServiceStudio&#xff0c;如下填写地址&#xff0c;点击【Get】按钮 会显示出需要传参的地方&#xff0c;在value中填写xml参数 输入完value值后&#xff0c;点击【Invok…

Navicat工具导出Mysql数据表结构到Excel文件中

原文链接&#xff1a;https://blog.csdn.net/zt15732625878/article/details/77978266 ------------------------------------------------------------------------ 前言 项目中数据库设计已经完成&#xff0c;现在到了代码实现的阶段&#xff0c;数据库中没有数据&#xff…

利用MAVEN的profile 实现打包环境的切换

乐哉码农产生问题的背景 由于在项目开发的时候&#xff0c;我们一般都是使用的本地库&#xff0c;数据库连接写的是本地的&#xff0c;如果我们将项目打成war的时候&#xff0c;里面的配置连接写的是我们本地的&#xff0c;当我们直接把war拷贝到服务器上面进行部署的时候&…

centos升级glibc(升级到 2.17版)

1、原先的系统glibc库的版本是2.12&#xff0c;需要升级到2.17版本。 下载地址&#xff1a; http://ftp.gnu.org/gnu/glibc/ http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz 这里可以选择你所需要的版本。 2、安装部署 [rootkafzook1 common]# tar -xf glibc-2.17.tar.g…

oracle data guard方案,Oracle Data Guard 概念篇

一个Data Guard 配置由一个生产库和一个或者多个standby数据库组成&#xff0c;在Data Guard配置中&#xff0c;主库和备库都既可以是rac环境&#xff0c;也可以是单机环境。这篇文章主要介绍dataguard的一些基本知识dataguard的分类、dataguard的服务类型、dataguard的保护模式…

洛谷P4133 [BJOI2012]最多的方案(记忆化搜索)

题意 题目链接 求出把$n$分解为斐波那契数的方案数&#xff0c;方案两两不同的定义是分解出来的数不完全相同 Sol 这种题&#xff0c;直接爆搜啊。。。 打表后不难发现$<1e18$的fib数只有88个 最先想到的应该是直接把$n$加入到搜索状态里&#xff0c;然后枚举能被分成哪些 但…

大话php设计模式视频,大话PHP设计模式

工厂模式用工厂方法或者类来实例化对象&#xff0c;而不是直接new。首先我们需要创建一个工厂类&#xff0c;比如Factory.php。如果不使用工厂模式的&#xff0c;我们需要一个对象的时候通常需要new Inexistence\girlfriend();然而我们一般不只在一个地方需要这个对象&#xff…

美团点评基于MGR的CMDB高可用架构搭建之路【转】

王志朋 美团点评DBA 曾在京东金融担任DBA&#xff0c;目前就职于美团点评&#xff0c;主要负责金融业务线数据库及基础组件数据库的运维。 MySQL Group Replication&#xff08;以下简称MGR&#xff09;&#xff0c;于5.7.17版本正式GA&#xff0c;由Oracle官方出品&#xff0c…

redmine更换主题

主题列表&#xff1a;http://www.redmine.org/projects/redmine/wiki/Theme_List 虽然有很多主题&#xff0c;但是很多主题都是要钱的&#xff0c;像这类&#xff08;上图&#xff09;没有下载地址的&#xff0c;都是要钱的。 含GitHub的下载地址的&#xff0c;是免费可下载的&…