NIO 是为了弥补 IO 操做的不足而诞生的。主要特征是管道(channel)、缓冲(Buffer)、选择器(Selector)。缓存
channel并发
至关于传统 IO 中的流,到任何目的地的数据都要经过一个 channel 对象。Buffer 实际是一个容器对象。线程
Buffer对象
八大基本数据类型,除了 Boolean ,都有缓冲区类型:基本类型+Buffer。事件
Selector资源
选择器用于监听多个管道的事件。it
传统的阻塞 IO 能够很方便知道何时读写,对非阻塞 IO 通道,能够用选择器,知道管道准备好了。io
上面是 NIO 的几个特征的概论,那么 NIO 与 IO 之间的优缺点是什么?效率
区别是有两点:容器
首先解释第一点,IO 面向流是一字节一字节的处理和操做。一个输入和输出流都是一个字节进行。致使了字节的输入和输出效率不高。
NIO 面向快,生产与消费都是一个数据快,相比于按字节处理数据要快得多。同时 NIO 采用了“预读”的方式,当你读取一部分数据时,它会猜想你下一步要读那些数据,提早缓存下来。
第二点,IO 是阻塞的,当一个线程调用 read或者 write 时,线程被阻塞,只要等数据读完或者写完,线程才能再次被调用。
NIO ,使用一个线程发送读取数据,没有获得响应以前,线程是空闲的。此时线程能够去执行其余任务。
NIO 的缺点是,由于 NIO 是面向缓存区操做,每次处理都是在缓冲区中处理的,问题是每次操做都必须判断缓冲区中的数据是否已经处理完整,由于只读取一部分的数据进行处理,是没有意义的,因此每次数据处理以前都要检测缓冲区数据。
NIO 与 IO 的应用场景
NIO:同时打开上万链接,这些链接只会发送少许的数据,选择 NIO 更合适。
IO:少许链接,每一个链接发送大量数据,选择传统 IO 更合适,
判断依据是数据处理的响应时间、检测缓冲区数据的时间。
有一个网友讲的生动的例子:
之前的流老是堵塞的,一个线程只要对它进行操做,其它操做就会被堵塞,也就至关于水管没有阀门,你伸手接水的时候,无论水到了没有,你就都只能耗在接水(流)上。
nio的Channel的加入,至关于增长了水龙头(有阀门),虽然一个时刻也只能接一个水管的水,但依赖轮换策略,在水量不大的时候,各个水管里流出来的水,均可以获得妥
善接纳,这个关键之处就是增长了一个接水工,也就是Selector,他负责协调,也就是看哪根水管有水了的话,在当前水管的水接到必定程度的时候,就切换一下:临时关上当
前水龙头,试着打开另外一个水龙头(看看有没有水)。
当其余人须要用水的时候,不是直接去接水,而是事前提了一个水桶给接水工,这个水桶就是Buffer。也就是,其余人虽然也可能要等,但不会在现场等,而是回家等,能够作
其它事去,水接满了,接水工会通知他们。
这其实也是很是接近当前社会分工细化的现实,也是统分利用现有资源达到并发效果的一种很经济的手段,而不是动不动就来个并行处理,虽然那样是最简单的,但也是最浪费资源的方式。