大数据-基础NIO-什么是NIO?NIO三大组件Buffer、Channel、Selector的特点

一、NIO简介


1、Java中的IO介绍

  1. BIO:BlockingIO,同步式阻塞式IO,即传统的IO,是Java中最早期的流
  2. NIO:Non-BlockingIO,又称New IO,同步式非阻塞式IO,是JDK1.4提供的流
  3. AIO:AsynchronousIO,异步式非阻塞式IO,可以认为是NIO的二代版本,是JDK1.8提供的流

2、概述

  1. NIO是JDK1.4出现的一个新的用于进行数据传输的流
  2. 全称是Non-Blocking IO,是一种同步式非阻塞式的IO,也是一种能供进行多路复用的IO
  3. NIO中有3大组件:Buffer、Channel、Selector
  4. NIO在使用的时候可以基于事件驱动方式来实现

3、BIO的缺点

  1. 一对一的连接方式:即每一个连接请求需要对应一个线程,在请求量大的情况下,会导致服务器端的压力非常大从而致使整个服务器的处理效率变低
  2. 阻塞:当线程在进行read或者write的时候,除非读完或者写完,否则在这个过程中不能发生任何操作
  3. 单向传输:数据只能从一端传向另一端,如果需要反向传输需要令创建流对象

4、NIO的特点

  1. 一对多的连接方式:利用一个或者少量线程处理大量的连接请求,降低服务器端的压力
  2. 非阻塞:在线程不能进行read或者write方法的时候,立即返回0,等待下一次操作
  3. 双向传输:利用通道可以实现数据的双向

5、NIO的缺点

  1. 在请求量比较大的情况下会出现部分请求的响应时间比较长的现象
  2. 不适用于长任务场景,不然会导致其他的请求无法处理

6、BIO和NIO的比较

BIO NIO
同步阻塞 同步非阻塞

单向传输数据

可以双向传输数据

一对一的连接方式

一对多的连接方式

面向流操作

面向缓冲区操作

适合于请求少、长连接场景

适合于大量请求、短连接的场景

二、Buffer缓冲区


1、Buffer简介

      特点

  1. Buffer又称之为缓冲区,是用于存储数据的容器
  2. 本质上是一个数组,在内存中占用了一块连续的空间
  3. Java中针对不同的基本类型提供了不同的缓冲区(但需注意的是没有boolean类型对应的缓冲区)
  4. 其中最基本的字节缓冲区ByteBuffer

2、ByteBuffer字节缓冲区

      概述

  1. 字节缓冲区,继承了Buffer类
  2. 底层是依靠字节数组来存储数据
  3. 本身是一个抽象类,需要利用其子类创建对象或者是利用其提供的allocate或者是wrap方法来创建ByteBuffer对象
  4. 重要位置:capacity >= limit >= position >= mark

       重要位置

  1. capacity:容量位。用于标记该缓冲区的容量,在缓冲区创建好之后就不再改变
  2. limit:限制位。用于限制操作位position所能达到的最大位置。在缓冲区刚创建的时候指向容量位
  3. position:操作位。用于指向要操作的位置,实际意义类似于数组中的下标。在缓冲区刚创建的时候指向0
  4. mark:标记位。用于进行标记。在缓冲区刚创建的时候指向-1,默认不启用

三、Channel通道


1、Channel简介

  1. Channel,称之为通道,在NIO中用于完成数据的传输
  2. 在操作的时候是面向缓冲区进行的
  3. 可以实现数据的双向传输
  4. Channel默认是阻塞的,可以手动设置为非阻塞

2、FileChannel介绍

  1. FileChannel,是面向文件的通道
  2. 可以利用FileChannel完成对文件的读写操作
  3. 利用FileChannel读取文件的时候,是先将文件中的内容映射到虚拟内存中,然后再读取到程序的缓冲区中
  4. FileChannel不能直接创建,可以利用FileInputStream、FileOutputStream、RandomAccessFile对象中的个体Channel()方法获取
  5. 如果是通过FileInputStream获取FileChannel,那么只能进行读取操作
  6. 如果是通过FileOutputStream获取FileChannel,那么只能进行写入操作
  7. 如果是通过RandomAccessFile获取FileChannel,那么可以进行读写操作

3、UDP概述

  1. 用于进行UDP收发的通道
  2. 是无连接的网络协议,只能进行发送和接受的操作
  3. 基本类是DatagramChannel,是一个抽象类

4、TCP概述

  1. 用于进行TCP通信的通道
  2. 需要进行连接的网络协议
  3. 提供了连接、接收、读取、写入操作
  4. 客户端通道是SocketChannel,服务器端通道是ServerSocketChannel

5、通道总结

             Channel通道在NIO中用于完成数据的传输,其中FileChannel是文件通道,UDP与TCP是网络传输层的通道。

四、Selector多路复用选择器


一、概述

  1. Selector 称为多路复用选择器
  2. 对通道进行选择,需要基于事件进行驱动
  3. 针对了四类事件:connect、accept、read、write,四类事件定义在SelectionKey中
  4. 可以实现利用一个或者少量线程处理大量请求
  5. 适用于大量的段任务场景,不适用于长任务场景
  6. Selector针对的必须是非阻塞的通道(Channel)

 总结不易,期待您的关注,我们一起进步,冲冲冲!!!

猜你喜欢

转载自blog.csdn.net/weixin_47055922/article/details/108116379