一. Scatter/Gather概述
- 作用: 描述从Channel中读取或者写入到Channel的操作
- 定义:
- Scatter(分散):将Channel数据读入buffer的时候,Channel将其中的数据分散(Scatter)到多个buffer中
- Gather(聚集):将buffer数据写入Channel的时候,Channel将多个buffer数据聚集(Gather)后发送给Channel
- 何时用?
- 用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体。
二. 用法
- Scattering Reads
- 步骤:
- 将buffer插入数组
- 将数组传入channel.read()方法中
- 注意:
- 当一个buffer被写满之后,channel紧接着向另一个buffer中写(必须先把上一个填满,才会往后写)
- Scattering Reads不适用于动态消息(消息大小不固定)由于buffer必须把上一个填满才向下一个写
- 实现:
ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer[] bufferArray = { header, body }; channel.read(bufferArray);
- 步骤:
- Gathering Writes
- 步骤:同上
- 注意:
- channel.write()方法会按照buffer在数组的顺序,将数据写入channel
- 只有position和limit之间的数据才会被写入。也就是buffer的剩余数据,不是buffer中所有数据
- Gathering Writes 很适合处理动态消息
- 实现:
ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); //省略将数据写入buffer的方法 ByteBuffer[] bufferArray = { header, body }; channel.write(bufferArray);