首页 > 试题广场 >

说一说NIO的实现原理

[问答题]

说一说NIO的实现原理

推荐

得分点

​ Buffer、Channel、Selector

参考答案

标准回答

​ NIO是基于IO多路复用模型的实现,它包含三个核心组件,分别是Buffer、Channel、Selector。

  1. NIO是面向缓冲区的,在NIO中所有的数据都是通过缓冲区处理的。Buffer就是缓冲区对象,无论读取还是写入,数据都是先进入Buffer的。Buffer的本质是一个数组,通常它是一个字节数组,也可以是其他类型的数组。Buffer是一个接口,它的实现类有ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer。
  2. Channel是一个通道,可以通过它读取和写入数据。与流不同的是,流是单向的,而Channel是双向的。数据可以通过Channel读到Buffer里,也可以通过Channel写入到Buffer里。为了支持不同的设备,Channel接口有好几种子类,如FileChannel用于访问磁盘文件、SocketChannel和ServerSocketChannel用于TCP协议的网络通信、DatagramChannel用于UDP协议的网络通信。
  3. Selector是多路复用器,可以通过它监听网络IO的状态。它可以不断轮询注册的Channel,如果某Channel上有连接、读取、写入事件发生,则这个Channel就处于就绪状态,就会被Selector轮询出来。所有被轮询出来的Channel集合,我们可以通过SelectionKey获取到,然后进行后续的IO操作。

加分回答

​ Buffer对象包含三个重要的属性,分别是capacity、position、limit。其中,capacity代表Buffer的容量,就是说Buffer中最多只能写入capacity个数据。position代表访问的位置,它的初始值为0,每读取/写入一个数据,它就会向后移动一个位置。limit代表访问限制,就是本次操作最多能读取/写入多少个数据。这三个属性的关系是,position<=limit<=capacity,Buffer通过不断调整position和limit的值,使得自身可以不断复用。

延伸阅读

​ Java NIO根据操作系统的不同,会对Selector做不同的实现。如Linux上的PollSelectorProvider、Windows上的WindowsSelectorProvider、MacOS上的KQueueSelectorProvider等。在使用Selector时,我们不需要指定哪一个实现,JDK会自动选择合适的Selector实现。

编辑于 2021-09-15 10:39:16 回复(0)
nio是非阻塞的io,nio是一种基于通道和缓冲区的I/O方式,它可以直接使用native函数库直接分配堆外内存,然后通过一个存储在java堆里面DirectByteBuffer对象作为这块内存的直接引用进行操作。避免了native堆和java堆中来回复制数据,提高了性能。
NIO主要有三大核心部分:buffer、channel、selector,传统IO是基于流的操作,NIO是基于channel和buffer进行操作。数据总是从channel读取到buffer中,或者从buffer中写入到channel中。selector用于监听多个通道的事件,比如连接的打开、数据达到等。因此,单个线程可以监听多个数据通道。
buffer(缓冲区)是基于特定存储类型的容器。无论数据读写,都是先进buffer,buffer的本质就是数组。
channel是数据通道。与流不同,流是单向的,channel则是双向的。数据可以通过channel读到buffer中,也可以通过channel写入到buffer里。
selector是多路复用器。它可以不断轮询注册的channel,如果某个channel上有连接、读写事件发生,则channel处于就绪状态,会被selector轮询出来。所有被轮询出来的channel集合,可以通过selectionKey获取到,然后进行后续的IO操作。
发表于 2022-02-14 19:48:15 回复(0)
链接:https://www.nowcoder.com/questionTerminal/e50ab9f51e5840c090eb2807ef8dfc89
来源:牛客网

NIO是基于IO多路复用模型的实现,它包含三个核心组件,分别是Buffer、Channel、Selector。

  1. NIO是面向缓冲区的,在NIO中所有的数据都是通过缓冲区处理的。Buffer就是缓冲区对象,无论读取还是写入,数据都是先进入Buffer的。Buffer的本质是一个数组,通常它是一个字节数组,也可以是其他类型的数组。Buffer是一个接口,它的实现类有ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer。
  2. Channel是一个通道,可以通过它读取和写入数据。与流不同的是,流是单向的,而Channel是双向的。数据可以通过Channel读到Buffer里,也可以通过Channel写入到Buffer里。为了支持不同的设备,Channel接口有好几种子类,如FileChannel用于访问磁盘文件、SocketChannel和ServerSocketChannel用于TCP协议的网络通信、DatagramChannel用于UDP协议的网络通信。
  3. Selector是多路复用器,可以通过它监听网络IO的状态。它可以不断轮询注册的Channel,如果某Channel上有连接、读取、写入事件发生,则这个Channel就处于就绪状态,就会被Selector轮询出来。所有被轮询出来的Channel集合,我们可以通过SelectionKey获取到,然后进行后续的IO操作。

加分回答

Buffer对象包含三个重要的属性,分别是capacity、position、limit。其中,capacity代表Buffer的容量,就是说Buffer中最多只能写入capacity个数据。position代表访问的位置,它的初始值为0,每读取/写入一个数据,它就会向后移动一个位置。limit代表访问限制,就是本次操作最多能读取/写入多少个数据。这三个属性的关系是,position<=limit<=capacity,Buffer通过不断调整position和limit的值,使得自身可以不断复用。

发表于 2021-11-25 11:27:35 回复(0)