Java NIO原生支持scatter和gather。Scatter/Gather是从channel中读取或者是向channel中写入时的概念。
一个scatter类型的reading操作,就是一次读操作中会读取多个buffer。
一个gather类型的writing操作,就是一次向channel中写入多个buffer。
在需要分别处理传输数据的各个部分的情况下,Scatter/Gather非常有用。例如,一个消息包含一个header和一个body,你可能需要把header和body分成两个buffer来处理。这样可能会使工作更加容易。
Scattering Reads
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);
注意,buffer加入数组的顺序就是传递给channel的处理顺序。一旦buffer读满了,channel就会移动到下一个buffer。
事实上scattering的读操作,直到一个buffer满了才会移动到下一个buffer的特性,导致它不适合动态大小的buffer。换言之,如果你有一个固定大小128bytes的buffer,那么scattering会工作正常。
Gathering Writes
一个 “gathering write”的写操作,如图所示:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);
buffer数组被传递给write()方法,该方法按照buffer在数组中的顺序写入buffer的内容。只有在position和limit之间的部分才能写入。因此,如果一个buffer的容量为128字节,但只包含58字节(这个大小是指position到limit的大小),则只有58字节从该缓冲区写入通道。因此和Scatter操作相比,Gathering操作可以很好的处理动态大小buffer。
下一篇:【译】Java NIO Channel to Channel Transfers
来源:CSDN
作者:nickDaDa
链接:https://blog.csdn.net/nickDaDa/article/details/103820373