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

基本含义

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

方法列表

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

xxxStream.reset();//reset之后,读取到的数据将会和刚才调用mark 方法后read的数据是相同的

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

[五] JavaIO之InputStream OutputStream简介 方法列表说明相关推荐

  1. 字节流InputStream/OutputStream

    字节流InputStream/OutputStream 本篇将对JAVA I/O流中的字节流InputStream/OutputStream做个简单的概括: 总得来说,每个字节流类都有一个对应的用途, ...

  2. File 和 InputStream, OutputStream 的用法

    一.File 首先我们要先了解文件路径: 文件路径分为 绝对路径 和 相对路径 两种. 绝对路径:相对于树来说就是,从根节点到叶子结点的整个路径.windows即是从各个磁盘              ...

  3. 日期时间脚本库方法列表

    /** 日期时间脚本库方法列表 Date.prototype.isLeapYear 判断闰年 Date.prototype.Format 日期格式化 Date.prototype.DateAdd 日期 ...

  4. jQuery学习笔记--JqGrid相关操作 方法列表 备忘 重点讲解(超重要)

    JqGrid相关操作备忘 方法列表 特别推荐:怎样获取某一方某一列的值: [html] view plaincopy var rowdata=jQuery("#list").jqG ...

  5. idea中查看类中所有方法列表(Alt+7)(亲测)

    idea中查看类中所有方法列表 当我们在开发中,或者在读别人代码时,如何能快速定位到想看的方法: 我们以activiti中的RepositoryService为例,如下图,RepositoryServ ...

  6. JDK 8 Javadoc调整了方法列表

    自开始以来, Javadoc输出基本上是静态HTML,具有导航链接和外观的简单样式表样式. Java SE 7很长时间以来就看到Javadoc输出默认外观的第一个重大变化 ,现在看来JDK 8将在生成 ...

  7. C#获取当前堆栈的各调用方法列表

    在使用.NET编写的代码在debug时很容易进行排查和定位问题,一旦项目上线并出现问题的话那么只能依靠系统日志来进行问题排查和定位,但当项目复杂时,即各种方法间相互调用将导致要获取具体的出错方法或调用 ...

  8. SAS(五)建立SAS数据集的方法及导出数据

    SAS(五)建立SAS数据集的方法 1.data步自己输入数据建立. data oranges; input variety $ flavor texture looks; /*total=flavo ...

  9. idea在类下面展示方法列表

    点击⚙ 下的Show Members 即可在类下看见方法列表

最新文章

  1. 清华大学医学院张明君团队招聘脑机接口与微纳医学交叉领域博士后
  2. asp开发工具_VSCode搭建完美的asp.net core开发环境,看完这篇就够了
  3. 网站推广中哪些优化方法是不利于搜索引擎网站推广的呢?
  4. DataScience:风控场景之金融评分卡模型的简介、构建(逻辑回归)开发(转评分卡)、使用过程(线上实现)之详细攻略
  5. 禁止vim生成 un~文件
  6. linux下增加磁盘改变指定文件路径分区挂载点和迁移数据
  7. SQL update select结合语句详解及应用
  8. java源文件扩展名_java源文件名的后缀是什么?
  9. 笔记本如何选择修复计算机,如何处理旧的笔记本电脑?这些操作必不可少!
  10. Mountain Number FZU-2109数位dp
  11. 谁将成为下一个风口?
  12. java thread等特,进阶之路|奇妙的Thread之旅
  13. 【概率论与数理统计】小结7 - 统计学中的基本概念
  14. 2022爱分析・汽车行业数字化实践报告
  15. Linux环境安装ghostscript
  16. 如何下载安装Devc++
  17. Place_opt步骤详细解析(另附两周年活动中奖名单)
  18. ES5、ES6和ES2015有什么区别?
  19. 决策树(信息熵、增益率、基尼指数)
  20. c#中应用skinEngine给应用程序换皮肤

热门文章

  1. [转]ghost手动备份及遇见的问题
  2. 闭运算—lhMorpClose
  3. 优化SQl语句的十个重要步骤
  4. mysql的突然变成本地不能用密码,远程要用密码才能登录,这是神马情况???求解...
  5. “未能为域创建GPO 出现扩展错误”的解决办法
  6. 云企业网的应用于功能详解
  7. 代码文件的编码不统一导致的坑
  8. 《C++游戏编程入门(第4版)》——1.8 Lost Fortune简介
  9. OSChina 周二乱弹 ——假期综合症
  10. Sth about Haml