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

转载 2018年04月17日 15:57:45

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

代码示例如下:

1ByteBuffer header = ByteBuffer.allocate(128);
2ByteBuffer body   = ByteBuffer.allocate(1024);
3 
4ByteBuffer[] bufferArray = { header, body };
5 
6channel.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

代码示例如下:

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

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


转载于:http://ifeve.com/java-nio-scattergather/

【JAVA】【NIO】5、Java NIO Scatter / Gather

标题的意思是Java NIO的分散集中 Java NIO带有内置的分散收集的支持。分散收集的概念主要用于通道的读写。 对一个通道的分散读取就是将数据读到多个buffer中,因此,通道将数据分散到多...
  • chiweitree
  • chiweitree
  • 2015-03-17 15:20:26
  • 1077

JavaNIO chm帮助文档

  • 2017年10月09日 17:20
  • 163KB
  • 下载

NIO边看边记 之 Scatter/Gather(四)

1.ScatterScatter(分散)操作是指可以将从channel中读取的内容分散的写到不同的buffer中。注意必须要先将前面的buffer写满之后才能写后面的buffer。因此,Scatter...
  • fan2012huan
  • fan2012huan
  • 2016-05-04 21:07:33
  • 436

Java NIO (三)-分散(Scatter)/聚集(Gather)

分散和聚集 I/O 是使用多个(数组)而不是单个缓冲区进行数据读/写;  分散(Scatter)从通道中读取数据时写入多个缓冲区中,通道将数据“分散”到多个缓冲区中;  聚集(Gather)写入通...
  • idiandi
  • idiandi
  • 2017-03-07 11:50:49
  • 269

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:17
  • 257

Java NIO (四) Scatter/Gather

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

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:36
  • 1139

什么是scatter / gather

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

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

  • rickArkin
  • rickArkin
  • 2007-12-12 18:24:00
  • 2111

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

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

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