Java NIO提供了对Scatter(发散)和Gather(聚合)的支持。这两个概念是用于我们进行Channel读写的。
发散读允许我们在一次读操作中将Channel中的数据读入多个Buffer。而聚合写允许我们在一次写操作中将多个Buffer的数据写入一个Channel.
如果我们需要把数据分隔处理时,发散/聚合就非常有用了。例如,如果我们要处理一个包含着body和head的信息,我们可以将body和head分开储存在不同的Buffer中,这样我们就可以更容易分开处理这两部分信息。
发散读例图:
| Java NIO: Scattering Read |
简单的发散读实现:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);
如上,我们生成了一个ByteBuffer数组,调用Channel的读方法时,会将Channel(数据源)的数据按数组顺序先后读入两个Buffer中,也就是先填满128位的head,如果还有数据,就写入body.
聚合写例图:
| Java NIO: Gathering Write |
简单的聚合写实现:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);
同样是按照数组顺序将两个Buffer中的数据先后写入Channel中