【Java NIO 简例】分散(Scatter) - 聚集(Gather)

阅读更多

原文:《Java NIO Scatter / Gather》

 

Scatter(分散):将一个 Channel 中的数据读取到多个 Buffer 中。

Gather(聚集):将多个 Buffer 中的数据写入一个 Channel 中。

Scatter/Gather 机制可以方便处理多个分开的数据块。如,一条消息由消息头与消息体组成;将它们分到两个不同的 buffer 中,可以更方便地分而治之。

 

Scatter:分散读取

【Java NIO 简例】分散(Scatter) - 聚集(Gather)_第1张图片

示例

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

channel.read() 方法会将数据依次填入 resultBuffers 数组的各 buffer 中;

前一个 buffer 被填满数据时才会填后一个 buffer;

即,示例中规定了 header 的长度是 固定 的 128 个字节(byte)。

 

 

Gather:聚集写入

【Java NIO 简例】分散(Scatter) - 聚集(Gather)_第2张图片

示例

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] dataBuffers = {header, body};
channle.write(dataBuffers);

channel.write() 方法会依次将 dataBuffers 数组中各 buffer 所含数据写入 channel;

该方法只会将 buffer 中的有效数据写入 channel

即,示例中的 header 容量是 128 个字节(byte);如果其有效数据只有 50 个字节,则此50个字节被写入 channel 后,就会开始将 body 中的数据写入 channel。

相对 Scatter 的“固定长度”而言,Gather 的处理是动态的“可变长度”。所以在使用要特别注意约定好数据格式,防止“约定长度”不一致导致接收方无法正确解析数据。

 

 

 

 

  • 【Java NIO 简例】分散(Scatter) - 聚集(Gather)_第3张图片
  • 大小: 14.4 KB
  • 【Java NIO 简例】分散(Scatter) - 聚集(Gather)_第4张图片
  • 大小: 13.8 KB
  • 查看图片附件

你可能感兴趣的:(nio)