一、Java中的IO介绍数组
- BIO:BlockingIO,同步式阻塞式IO,即传统的IO,是Java中最先期的流
- NIO:Non-BlockingIO,又称New IO,同步式非阻塞式IO,是JDK1.4提供的流
- AIO:AsynchronousIO,异步式非阻塞式IO,能够认为是NIO的二代版本,是JDK1.8提供的流
二、概述服务器
- NIO是JDK1.4出现的一个新的用于进行数据传输的流
- 全称是Non-Blocking IO,是一种同步式非阻塞式的IO,也是一种能供进行多路复用的IO
- NIO中有3大组件:Buffer、Channel、Selector
- NIO在使用的时候能够基于事件驱动方式来实现
三、BIO的缺点网络
- 一对一的链接方式:即每个链接请求须要对应一个线程,在请求量大的状况下,会致使服务器端的压力很是大从而导致整个服务器的处理效率变低
- 阻塞:当线程在进行read或者write的时候,除非读完或者写完,不然在这个过程当中不能发生任何操做
- 单向传输:数据只能从一端传向另外一端,若是须要反向传输须要令建立流对象
四、NIO的特色dom
- 一对多的链接方式:利用一个或者少许线程处理大量的链接请求,下降服务器端的压力
- 非阻塞:在线程不能进行read或者write方法的时候,当即返回0,等待下一次操做
- 双向传输:利用通道能够实现数据的双向
五、NIO的缺点异步
- 在请求量比较大的状况下会出现部分请求的响应时间比较长的现象
- 不适用于长任务场景,否则会致使其余的请求没法处理
六、BIO和NIO的比较spa
BIO NIO 同步阻塞 同步非阻塞 单向传输数据线程
能够双向传输数据对象
一对一的链接方式继承
一对多的链接方式事件
面向流操做
面向缓冲区操做
适合于请求少、长链接场景
适合于大量请求、短链接的场景
一、Buffer简介
特色
- Buffer又称之为缓冲区,是用于存储数据的容器
- 本质上是一个数组,在内存中占用了一块连续的空间
- Java中针对不一样的基本类型提供了不一样的缓冲区(但需注意的是没有boolean类型对应的缓冲区)
- 其中最基本的字节缓冲区ByteBuffer
二、ByteBuffer字节缓冲区
概述
- 字节缓冲区,继承了Buffer类
- 底层是依靠字节数组来存储数据
- 自己是一个抽象类,须要利用其子类建立对象或者是利用其提供的allocate或者是wrap方法来建立ByteBuffer对象
- 重要位置:capacity >= limit >= position >= mark
重要位置
- capacity:容量位。用于标记该缓冲区的容量,在缓冲区建立好以后就再也不改变
- limit:限制位。用于限制操做位position所能达到的最大位置。在缓冲区刚建立的时候指向容量位
- position:操做位。用于指向要操做的位置,实际意义相似于数组中的下标。在缓冲区刚建立的时候指向0
- mark:标记位。用于进行标记。在缓冲区刚建立的时候指向-1,默认不启用
一、Channel简介
- Channel,称之为通道,在NIO中用于完成数据的传输
- 在操做的时候是面向缓冲区进行的
- 能够实现数据的双向传输
- Channel默认是阻塞的,能够手动设置为非阻塞
二、FileChannel介绍
- FileChannel,是面向文件的通道
- 能够利用FileChannel完成对文件的读写操做
- 利用FileChannel读取文件的时候,是先将文件中的内容映射到虚拟内存中,而后再读取到程序的缓冲区中
- FileChannel不能直接建立,能够利用FileInputStream、FileOutputStream、RandomAccessFile对象中的个体Channel()方法获取
- 若是是经过FileInputStream获取FileChannel,那么只能进行读取操做
- 若是是经过FileOutputStream获取FileChannel,那么只能进行写入操做
- 若是是经过RandomAccessFile获取FileChannel,那么能够进行读写操做
三、UDP概述
- 用于进行UDP收发的通道
- 是无链接的网络协议,只能进行发送和接受的操做
- 基本类是DatagramChannel,是一个抽象类
四、TCP概述
- 用于进行TCP通讯的通道
- 须要进行链接的网络协议
- 提供了链接、接收、读取、写入操做
- 客户端通道是SocketChannel,服务器端通道是ServerSocketChannel
五、通道总结
Channel通道在NIO中用于完成数据的传输,其中FileChannel是文件通道,UDP与TCP是网络传输层的通道。
1、概述
- Selector 称为多路复用选择器
- 对通道进行选择,须要基于事件进行驱动
- 针对了四类事件:connect、accept、read、write,四类事件定义在SelectionKey中
- 能够实现利用一个或者少许线程处理大量请求
- 适用于大量的段任务场景,不适用于长任务场景
- Selector针对的必须是非阻塞的通道(Channel)
总结不易,期待您的关注,咱们一块儿进步,冲冲冲!!!