JAVA NIO简明教程 五 scatter/Gather
JAVA NIO简明教程 五 scatter/Gather
JAVA NIO 也支持scatter/gather(分散/聚合),分散/聚合是一个概念在读写通道的时候。
一个通道在读操作下能够写入到多个缓冲区的操作叫做分散。
多个缓冲区写入数据到一个通道的操作叫做聚合。
分散/聚合通常被用在当需要多个数据被分散的发送。例如一个消息包含消息头和消息体,你可能在不同的缓冲区里存放消息头,消息体。这样做使你在处理的时候能区分消息头和消息体。
scattering Reads
分散读操作能够读数据从一个通道到多个缓冲区。下面是图示例:
下面是代码示例,展示了scatter操作:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer [] bufferArray = {header, body};
channel.read(bufferArray);
reader方法传入的是一个数组,通道通过reader方法写数据到数组中的缓冲区,当其中一个缓冲区被填满,通道将移动到数组中的下一个缓冲区继续写数据。
scattering当写满一个缓冲区后才会移动到下一个缓冲区,他不能动态的调整大小,意味着,上面的示例中缓冲区分配大小要和处理的消息头消息体大小是一样,否则处理是不尽人意。
Gathering writes
聚合写操作是读多个缓冲区的数据写入到通道,下图示例
下面是代码示例,展示了如何做聚合处理
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);
和分散处理的很相像,不同的是这里使用的是通道的 write方法