Java NIO系列教程(四) Scatter 和 Gather

Java NIO系列教程(四) Scatter 和 Gather

Java NIO 开始支持 scatter/gather,scatter/gather 用于描述从 Channel(译者注:Channel 在中文常常翻译为通道)中读取或者写入到 Channel 的操做。java

  • Scatter(分散) 从 Channel 中读取是指在读操做时将读取的数据写入多个 buffer 中。所以,Channel 将从 Channel 中读取的数据“分散(scatter)”到多个 Buffer 中。编程

  • Gather(汇集) 写入 Channel 是指在写操做时将多个 buffer 的数据写入同一个 Channel,所以,Channel 将多个 Buffer 中的数据“汇集(gather)”后发送到 Channel。数组

Scatter 和 Gather 常常用于须要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不一样的 buffer 中,这样你能够方便的处理消息头和消息体。并发

1、Scattering Reads

Scattering Reads 是指数据从一个 channel 读取到多个 buffer 中。以下图描述:翻译

Java NIO: Scattering Read

代码示例以下:code

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

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

注意 buffer 首先被插入到数组,而后再将数组做为 channel.read() 的输入参数。read() 方法按照 buffer 在数组中的顺序将从 channel 中读取的数据写入到 buffer,当一个 buffer 被写满后,channel 紧接着向另外一个 buffer 中写。blog

Scattering Reads 在移动下一个 buffer 前,必须填满当前的 buffer,这也意味着它不适用于动态消息(译者注:消息大小不固定)。换句话说,若是存在消息头和消息体,消息头必须完成填充(例如 128byte),Scattering Reads 才能正常工做。教程

2、Gathering Writes

Gathering Writes 是指数据从多个 buffer 写入到同一个 channel。以下图描述:get

Java NIO: Gathering Write

代码示例以下:it

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

//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);

buffers 数组是 write() 方法的入参,write() 方法会按照 buffer 在数组中的顺序,将数据写入到 channel,注意只有 position 和 limit 之间的数据才会被写入。所以,若是一个 buffer 的容量为 128byte,可是仅仅包含 58byte 的数据,那么这 58byte 的数据将被写入到 channel 中。所以与 Scattering Reads 相反,Gathering Writes 能较好的处理动态消息。

转载自并发编程网 – ifeve.com,本文连接地址: Java NIO系列教程(四) Scatter/Gather

相关文章
相关标签/搜索