#05.Java NIO Scatter, Gather
Java NIO开始支持scatter/gater。scatter和gather分别用于从Channel中读取数据和写入数据到Channel中。
分散(Scatter)操作是指将同一个通道(Channel)的数据读到多个缓冲区(Buffer)中。
聚集(Gather)是指将多个缓冲区(Buffer)的数据写入到同一个通道(Channel)中。
分散/聚集(scatter/gather)操作非常适用于一些需要把数据分开几个不同的部分进行处理的场景。例如处理固定大小的header和body的数据,你可以将header和body中的数据分别用不同的缓冲区中进行处理。
##分散读取(Scattering Reads)
分散读取是指将同一个通道中的数据读到不同的缓冲区中。如下图所示:
下面的代码演示了如何使用Scatterring Reads:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray );注意首先要将buffers插入到数组中,然后在再数组作为channel.read()的参数。channel.read()方法会依次将数组的缓冲区填满,上面的例子中,先填满header缓存区,然后再填满body缓冲区。
由于分散读取(Scattering Reads)在移动到下个缓冲区前,必须填满当前的缓冲区,所以分散操作并不适用于大小不固定的数据体。换言之,上面的例子中,header必须填充128个字节,否则无法正常工作。
##(聚集写入)Gathering Writes
聚集(Gather)是指将多个缓冲区(Buffer)的数据写入到同一个通道(Channel)中。。如下图所示:
下面的代码演示了如何使用Gathering Writes:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(buffers);缓冲区数组作为参数传递给channel.write()方法,这个方法依次从缓冲区中写入数据到通道中。缓冲区中有效数据才会写入到通道中,例如header缓冲区的容量为128字节,但实际有效数据位58字节,所以实际上header缓冲区中只有前58字节写入到了通道。因此,与分散读取操作不同,聚集写入(Gathering Writes)操作适用于大小不固定的数据块。

