在前文讲解NIO的时候捎带的提过BIO,BIO就是阻塞IO,是java 1.4出现,主要是通过流来进行相关的IO操作。
在对BIO进行说明之前,我们首先来理清楚一些概念,同步,异步,阻塞和非阻塞。
先说同步和异步,针对的对象的是执行任务的对象,他们之间的区别在于任务执行之后,本身处于一个什么样的状态,如果一直 等待 结果,就是同步;如果立即返回,去干别的事儿通过其他的方法得到结果,就是异步。
所谓阻塞和非阻塞针对的对象的是CPU,阻塞blocking、非阻塞non-blocking,CPU在等待结果的过程中的状态,例如排队的过程中什么也不做就是阻塞;一边排队,一遍玩王者荣耀就是非阻塞的。对于我们java而言,在使用中我们是通过线程来对IO进行调度操作的,那么使用BIO时阻塞的实际上是线程。
BIO可以说是每一个java开发者都熟悉的知识点,所以就不做过多的讲解,接下来主要来说明一下BIO和NIO的区别。
以上是BIO和NIO在理论上的一些区别,而实际上对于文件操作而言(例如文件复制等),BIO和NIO是没有什么区别的,不论是思路还是基本的处理流程,差别不是很大,可以说仅仅是不同的一套API而已。
能够体现BIO和NIO差别的地方在于网络编程领域。
我们知道BIO的流是阻塞的,因此也就意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入,该线程在此期间不能再干任何事情了。在网络编程中,BIO是一个线程对应一个流的操作,那么也就是说如果这个流没有结束,线程就需要一直等待。
但是NIO不需要,最重要的原因是选择器和非阻塞。
所谓非阻塞IO,分为读取和写入:
NIO在使用中,线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,一个单独的线程可以管理多个输入和输出通道(channel),此时需要用到的就是选择器,也就是所谓的多路复用。