BIO--Blocking IO--同步阻塞式IO--JDK1.4新增的IO
NIO--New IO--同步非阻塞式IO--JDK1.4新增IO
AIO-Asynchronous IO--异步非阻塞式IO--JDK1.8新增IO
下面说一下BIO的缺点:
会产生阻塞
一对一连接,客户端连接服务端都会创建一个线程,当客户端比较多的时候会创建大量的线程,比较耗费内存
客户端连接服务器之后不进行任何操作,但是线程依然存在于内存中,比较耗费内存
不能实现定点操作
NIO相比较于BIO,则完全解决了以上BIO的缺点。
NIO的组件主要有Buffer,Channel,Selector
1、Buffer - 缓冲区,面向磁盘操作,主要进行磁盘的读写,底层实际上是基于数组进行存储的
capacity - 容量,用来衡量数组大小的
limit - 限制位,限制操作位的尺度
position - 操作位,当前操作所指向的位置
mark - 标记位,位于操作位最开始的位置,通常认为标记位之前的数据是操作过的数据,且操作是准确无误的
clear - 清除缓冲区,操作位归零,限制位清空,限制位移动到容量位置,
flip - 反转缓冲区,相当于重新读取一遍之前的数据,限制位移动到操作位,操作位归零,标记位清空
reset - 重置缓冲区,将操作位移动到标记位
rewind - 重绕缓冲区,将限制位移动到容量位置,用于重复读取缓冲区中的数据
2、Channel - 传输数据,面向缓冲区的。Channel默认是阻塞的,需要手动设置为非阻塞模式
FileChannel - 文件拷贝,通过通道可以实现相同平台之间的零拷贝技术
3、Selector - 进行选择,默认情况下也是阻塞的,要求在使用时必须设置为非阻塞状态
利用此技术可以实现同一个服务器端接收多个客户端数据,可以用少量线程处理大量请求,实际上在底层依然是同步的