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

原创 2016年06月02日 10:11:30

Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。
分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。
聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将多个Buffer中的数据“聚集(gather)”后发送到Channel。

scatter / gather经常用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体。

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

Java NIO: Scattering Read

Java NIO: Scattering Read

代码示例如下:

1 ByteBuffer header = ByteBuffer.allocate(128);
2 ByteBuffer body   = ByteBuffer.allocate(1024);
3  
4 ByteBuffer[] bufferArray = { header, body };
5  
6 channel.read(bufferArray);

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

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

Gathering Writes

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

Java NIO: Gathering Write

Java NIO: Gathering Write

代码示例如下:

1 ByteBuffer header = ByteBuffer.allocate(128);
2 ByteBuffer body   = ByteBuffer.allocate(1024);
3  
4 //write data into buffers
5  
6 ByteBuffer[] bufferArray = { header, body };
7  
8 channel.write(bufferArray);

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

原文地址:http://tutorials.jenkov.com/java-nio/scatter-gather.html Java NIO开始支持scatter/gather,scatter/g...
  • tanga842428
  • tanga842428
  • 2016年10月14日 20:07
  • 237

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

Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。 分散(...
  • Flood_Dragon
  • Flood_Dragon
  • 2013年09月05日 23:20
  • 517

Java NIO (四) Scatter/Gather

Java NIO Scatter/Gather Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通...
  • yx2008302080
  • yx2008302080
  • 2015年11月25日 14:37
  • 163

Java NIO Scatter / Gather

Java NIO comes with built-in scatter / gather support. Scatter / gather are concepts used in reading...
  • kylinsoong
  • kylinsoong
  • 2013年12月09日 20:58
  • 1122

Java NIO系列教程(4):Scatter/Gather

 Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。 ...
  • zhangyuan19880606
  • zhangyuan19880606
  • 2016年04月24日 17:04
  • 109

GPU通用可编程技术中的scatter与gather

  • rickArkin
  • rickArkin
  • 2007年12月12日 18:24
  • 2018

什么是scatter / gather

scatter/gather方式是与block dma方式相对应的一种dma方式。         在dma传输数据的过程中,要求源物理地址和目标物理地址必须是连续的。但在有的计算机体系中,如...
  • lichengtongxiazai
  • lichengtongxiazai
  • 2014年10月23日 15:44
  • 1538

发散聚合IO(scatter-gather I/O)技术

scatter/gather I/O 2013-05-30 09:53:02 分类: LINUX scatter/gather方式是与block dma方式相对...
  • xiongping_
  • xiongping_
  • 2016年04月06日 16:53
  • 1384

scatter/gather 技术

    对于使用 scatter/gather 传输的情况,request_buffer (申请的dma内存区域)里边实际上是一个数组,每一个元素都是一个 struct scatterlist 的指针...
  • zhjuan
  • zhjuan
  • 2011年03月04日 15:19
  • 1715

分散/聚集 I/O(scatter-gather I/O)

概述 分散/聚集 I/O是一种可以在单次系统调用中对多个缓冲区输入输出的方法,可以把多个缓冲区的数据写到单个数据流,也可以把单个数据流读到多个缓冲区中。其命名的原因在于数据会被分散到指定缓冲区向量,或...
  • u012432778
  • u012432778
  • 2015年08月06日 23:43
  • 2227
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java NIO系列教程(四) Scatter/Gather
举报原因:
原因补充:

(最多只允许输入30个字)