NIO系列文章
1、Java NIO 基础一 NIO概念
2、Java NIO 基础二 缓冲区
3、Java NIO 基础三 通道
4、Java NIO 基础四 选择器

通道相当于一个传递物品的管子,两边都可以往对面传递东西。

有哪些通道?
对应文件IO和网络IO,通道也分为一个FileChannel和三个socket通道(SocketChannel、ServerSocketChannel和DatagramChannel)

基础
一般情况下,一个通道必然关联着一个文件描述符或者是文件句柄。
通道可以是单向的,也可以是双向的(读写)。
socket通道可以是阻塞的或非阻塞的,FileChannel只支持阻塞模式。

Scatter和Gather 发散和汇聚
从字面理解,通道支持多个缓冲区同时读写。这样能够充分利用现代操作系统多核CPU功能,同时填充或排干多个缓冲区。

Scatter/Gather是一个简单却强大的概念,它是指在多个缓冲区上实现一个简单的 I/O 操作。对于一个 write 操作而言,数据是从几个缓冲区按顺序抽取(称为 gather)并沿着通道发送的。

缓冲区本身并不需要具备这种gather 的能力(通常它们也没有此能力)。该 gather 过程的效果就好比全部缓冲区的内容被连结起来,并在发送数据前存放到一个大的缓冲区中。对于 read 操作而言,从
通道读取的数据会按顺序被散布(称为 scatter)到多个缓冲区,将每个缓冲区填满直至通道中的数据或者缓冲区的最大空间被消耗完。

大多数现代操作系统都支持本地矢量 I/O(native vectored I/O)。当您在一个通道上请求一个Scatter/Gather 操作时,该请求会被翻译为适当的本地调用来直接填充或抽取缓冲区。这是一个很大
的进步,因为减少或避免了缓冲区拷贝和系统调用。Scatter/Gather 应该使用直接的 ByteBuffers 以从本地 I/O 获取最大性能优势。


lane
1 声望1 粉丝