`

翻译-【Java NIO学习系列】Java NIO Scatter/Gather

 
阅读更多

  原文连接:http://tutorials.jenkov.com/java-nio/scatter-gather.html

     Jave NIO支持scatter/gather(分散/聚集),scatter/gather的概念用于描述从通道里面读取和写入通道。

     从通道里面分散读是在读操作的时候,读取的数据被写入多个buffer中。因此,通道“scatters”将数据从通道写入多个buffer中。

     聚集写入通道是在写操作时,写入多个buffer的数据到一个通道,因此,通道“gathers”将数据从多个buffer中写入通道。

     scatter/gather最实用的情况是:需要传输的数据各个部分要分开:例如:一个由消息头和消息体组成的消息,消息体和消息头可能被分开在不同的buffer中,这样处理后,将使得你分开在消息头和消息体更方便的做处理。

      Scattering Reads

      “Scattering Reads”:数据从一个通道读取到多个buffer,图示描述如下:

      

  代码示例如下:

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

ByteBuffer[] bufferArray = { header, body };

channel.read(buffers);

    注意buffers的首先包含在一个数组,然后再将数组作为channel.read() 的参数。read()方法从通道里面写数据到按照在数组中的顺序写入到buffers,当第一个buffer写满后,通道将会填充下个buffer。

    事实上Scattering Reads在移动下一个buffer前,必须填充完毕当前的buffer,这意味着它不适应用于消息部分是动态大小的。也就是说,如果存在消息头和消息体,消息头必须完成填充(例如 128byte),Scattering Read才能工作好。

     Gathering Writes

      "gathering write" 数据从多个buffer写入到通道里面,图示如下:

 

  代码示例入下:

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

//write data into buffers

ByteBuffer[] bufferArray = { header, body };

channel.write(buffers);

    buffers数组作为write()方法 的入参,按照数组中的顺序,一个个将buffer的内容写入。仅仅将buffer position 与 limit 之间的元素写入。因此,如果一个buffer的capacity 为128byte,仅仅包含58byte数据,58byte将被从buffer中写入到通道中。因此与Scattering Reads相反,Gathering Writes在动态的消息部分也能处理好。

  • 大小: 7.4 KB
  • 大小: 6.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics