原文连接:http://tutorials.jenkov.com/java-nio/scatter-gather.html
Jave NIO支持scatter/gather(分散/聚集),scatter/gather的概念用于描述从通道里面读取和写入通道。
从通道里面分散读是在读操作的时候,读取的数据被写入多个buffer中。因此,通道“scatters”将数据从通道写入多个buffer中。
聚集写入通道是在写操作时,写入多个buffer的数据到一个通道,因此,通道“gathers”将数据从多个buffer中写入通道。
scatter/gather最实用的情况是:需要传输的数据各个部分要分开:例如:一个由消息头和消息体组成的消息,消息体和消息头可能被分开在不同的buffer中,这样处理后,将使得你分开在消息头和消息体更方便的做处理。
Scattering Reads
“Scattering Reads”:数据从一个通道读取到多个buffer,图示描述如下:
代码示例如下:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(buffers);
注意buffers的首先包含在一个数组,然后再将数组作为channel.read() 的参数。read()方法从通道里面写数据到按照在数组中的顺序写入到buffers,当第一个buffer写满后,通道将会填充下个buffer。
事实上Scattering Reads在移动下一个buffer前,必须填充完毕当前的buffer,这意味着它不适应用于消息部分是动态大小的。也就是说,如果存在消息头和消息体,消息头必须完成填充(例如 128byte),Scattering Read才能工作好。
Gathering Writes
"gathering write" 数据从多个buffer写入到通道里面,图示如下:
代码示例入下:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(buffers);
buffers数组作为write()方法 的入参,按照数组中的顺序,一个个将buffer的内容写入。仅仅将buffer position 与 limit 之间的元素写入。因此,如果一个buffer的capacity 为128byte,仅仅包含58byte数据,58byte将被从buffer中写入到通道中。因此与Scattering Reads相反,Gathering Writes在动态的消息部分也能处理好。