JAVA NIO简明教程 五 scatter/Gather

JAVA NIO简明教程 五 scatter/Gather

JAVA NIO 也支持scatter/gather(分散/聚合),分散/聚合是一个概念在读写通道的时候。

一个通道在读操作下能够写入到多个缓冲区的操作叫做分散。
多个缓冲区写入数据到一个通道的操作叫做聚合。

分散/聚合通常被用在当需要多个数据被分散的发送。例如一个消息包含消息头和消息体,你可能在不同的缓冲区里存放消息头,消息体。这样做使你在处理的时候能区分消息头和消息体。

scattering Reads

分散读操作能够读数据从一个通道到多个缓冲区。下面是图示例:

scatter

下面是代码示例,展示了scatter操作:

    ByteBuffer header = ByteBuffer.allocate(128);
    ByteBuffer body = ByteBuffer.allocate(1024);
    
    ByteBuffer [] bufferArray = {header, body};
    channel.read(bufferArray);

reader方法传入的是一个数组,通道通过reader方法写数据到数组中的缓冲区,当其中一个缓冲区被填满,通道将移动到数组中的下一个缓冲区继续写数据。

scattering当写满一个缓冲区后才会移动到下一个缓冲区,他不能动态的调整大小,意味着,上面的示例中缓冲区分配大小要和处理的消息头消息体大小是一样,否则处理是不尽人意。

Gathering writes

聚合写操作是读多个缓冲区的数据写入到通道,下图示例

gather

下面是代码示例,展示了如何做聚合处理

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

//write data into buffers

ByteBuffer[] bufferArray = { header, body };

channel.write(bufferArray);

和分散处理的很相像,不同的是这里使用的是通道的 write方法

发布了121 篇原创文章 · 获赞 56 · 访问量 167万+

猜你喜欢

转载自blog.csdn.net/u013565163/article/details/83625724
今日推荐