IO体系——InputStream、OutputStream特性研究

前言

BIO是IO模型中最简单的一种,中文意思是阻塞式输入输出接口。也是比较原始的模式。
它是计算机早期IO的运行模式。在这种模式下,计算机一次读取数据过程是这样的。 以文件IO为例:
假如我们用Java写了一个进程P,进程P相对于操作系统来说属于外部进程。进程P发出要读取D盘中一个文件的命令请求,由于系统文件只能由操作系统来操作,CPU接收到程序P的命令后,由用户态转换为内核态,然后调度设备读取该文件,在读取文件过程中是由其他设备完成,CPU处于阻塞状态。等到数据读取到系统内存后,再由系统内存复制到进程P的内存中,整个读取过程完毕,然后由CPU开始执行接下来的命令操作,它的整个过程是每个设备联合起来的串行操作。

在IO读取过程中,CPU处于阻塞状态,必须等到其他设备将数据加载完毕,才能继续执行命令的模式,称为BIO模式,即同步阻塞模式。

Java接口

在Java中,进行BIO模式操作的顶层父级被封装在InputStream和OutputStream中,这两个接口代表着两种方向。InputStream代表向内存读取数据,OutputStream代表从内存中向外读出数据。其都实现了Closeable接口,表示使用完后必须要关闭。

InputStream

在InputStream中抽象了几个BIO模式的行为,其核心主要是这个方法:

read();

该方法表示一次读取一个字节的数据,如果没有可读字节将会返回-1.其他read()均为这个方法的变形。意思为将指定数据读取到内存中。

OutputStream

它最重要的方法就是这个:

wait();

其他wait()均为这个方法的变形。意思为将内存中的数据读出到指定位置。

特点

1. 方向性

InputStream和OutputStream都有方向性,InputStream是将数据读取到内存中,OutputStream是将内存数据读到外部。in和out都是针对内存而言的。这是IO流的方向性。

2. 普适性

它们支持各种数据类型的读取(文字、音频、图片、视频…),其子类实现有可操作文件的、音频的、图片的各种子类。比如AudioInputStream、ZipInputStream等等

3. 可逆性

至于是否可逆,可以先思考两个问题:

  1. 一个流对象读取第1个字节以后,能否再次读出该对象的第1个字节?
  2. 一个流对象使用完了以后,能否再次使用?

第2个问题是第1个问题的抽象。
以InputStream接口为例,它定义以下几个行为:

read()
read(byte b[])
read(byte b[], int off, int len)
skip(long n)
available()
mark(int readlimit)
reset()
markSupported()

其中定义了reset()方法,JDK解释调用该方法以后可以让流重新回到被mark标记的位置。
根据这个解释,流好像是可以复用的。但是在接口InputStream中,默认不支持该方法,需要子类自己去实现。
那么从这一点来看,IO流是可以具有复用特性的。

但是哪些情况下可以复用呢?
在BIO体系中,有几个子类实现了父类InputStream的reset方法。
在这里插入图片描述
不难看出,这些子类都属于带有缓冲区的包装流,并没有原始的节点流,比如FileInputStream。
在FileInputStream子类中,并不支持对系统文件IO流的reset操作。一个节点IO流对象是不可逆的。
也就是说一个流对象只能从开始读到末尾,读完以后就不再有意义。
如果想重新读取,有两个办法:

  1. 需要重新创建一个流对象。
  2. 将先前的流对象数据缓存到内存流中(ByteArrayInputStream),供其他地方使用。
4. 资源性

一个IO节点流,不是指的包装流,通常是指系统文件IO和网络IO两种,每一个节点流对象通常需要占用一个系统句柄资源(文件描述符)。
操作系统规定了每个进程可以开启的最大文件描述符个数,所以流对象并不是可以无穷无尽的使用,它其实是需要占用系统句柄的。如果使用完成以后没有关闭该流对象,会造成系统资源泄漏。因此在InputStream和OutputStream接口上,实现了Closeable接口。要求每个流对象使用完成以后必须关闭它。在父类InputStream、OutputStream中的close默认不做任何操作,由子类自己实现。

最后

这是java BIO流对象的顶级接口,定义了一些行为规范。如有描述不正确,感谢指正。
最后附上部分BIO家族图谱
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值