Scatter和Gather


Scatter和Gather


  • Java NIO​支持​Scatter​和​Gather
  • Scatter​和​Gather​用于描述从​Channel​中读取或者写入到​Channel​中的操作
  • Scatter​和​Gather​经常用于需要将传输的数据分开处理的场合:
  • 传输一个由消息头和消息体组成的消息,需要将消息体和消息头分散到不同的​Buffer​中,这样可以方便地处理消息头和消息体

Scatter


  • 分散Scatter从Channel中读取:​ 指在读操作时,将读取的数据写入多个​buffer​中
  • Channel​将从​Channel​中读取的数据分散​Scatter​到多个​Buffer​中

Gather


  • 聚集Gather写入Channel:​ 指在写操作时,将多个​Buffer​数据写入到同一个​Channel​中
  • Channel​将多个​Buffer​中的数据聚集​Gather​后发送到​Channel

Scattering Reads

  • Scattering Reads​是指数据从一个​Channel​读取到多个​Buffer​中
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​中写


Scattering Reader在移动到下一个buffer前,必须填满当前的buffer.所以不适用于消息大小不固定的动态消息.也就是说,如果存在消息头和消息体,消息头必须完成填充,Scattering Reads才能正常工作


Gathering Writes

  • Gathering Writes​是指数据从多个​buffer​写入到同一个​channel​中
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] byteArray = {header, body};
channel.write(byteArray);

  • buffer​数组是​write()​ 方法的入参
  • write()​ 方法会按照​buffe​r在数组中的顺序,将数据写入到​channel.​ 只有​position​和​limit​之间的数据才会被写入


如果一个buffer的容量为128字节,但是仅仅包含58字节的数据,那么这58字节的数据将被写入到channel中.因此,Gathering Writes能较好的处理动态消息