博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaNIO Scatter\Gather(5)
阅读量:3752 次
发布时间:2019-05-22

本文共 1356 字,大约阅读时间需要 4 分钟。

NIO支持scatter/gather。Scatter/Gather概念适用于从Channel读写数据的场景。

  • 分散读(Scattering Read)是指将channel的数据读出写入多个Buffer中的操作。正如字面所表达的,将Channel的数据 读出,并“分散”(Scattering)到多个Buffer中
  • 聚集写(Gathering Write)是指将多个Buffer的数据写到同一个channel中的操作。因此channel“聚集”(Gathering)了多个Buffer的数据

Scatter/Gathering适用于需要将传输的数据分开处理的场景。比如说,传输一个由header和body组成的消息,你可能需要把两个部分保存在不同的buffer里,以方便分开处理。

Scattering Read(分散读)

“Scattering Read”将一个Channel中的数据读入不同的Buffer中。下图是一个Scattering Read示例:

这里写图片描述

下面是Scattering Read的代码说明:

ByteBuffer header = ByteBuffer.allocate(128);ByteBuffer body   = ByteBuffer.allocate(1024);ByteBuffer[] bufferArray = { header, body };channel.read(bufferArray);

注意:这段代码先将buffer对象插入数组,然后整个数组作为Channel.read()的入参。read()方法会按照ByteBuffer数组中元素的位置将数据从Channel读出 向 buffer写入。一旦这个Buffer满了,就会立即填充下个Buffer。

Scattering Read只在写满一个Buffer后才填充下个的特性其实说明了Scattering Read不适用于大小不固定的动态消息。也就是说,如果一个消息有Header和body,而且header大小固定, 那么Scattering Read才适用。

Gathering Write

Gathering Write是指将多个Buffer的数据读出来写到同一个Channel里。下面是个示例:

这里写图片描述
下面是代码示例:

ByteBuffer header = ByteBuffer.allocate(128);ByteBuffer body   = ByteBuffer.allocate(1024);//write data into buffersByteBuffer[] bufferArray = { header, body };channel.write(bufferArray);

write()方法接收Buffer数组作为传参,会按照数组中Buffer元素顺序依次将Buffer中内容写入到Channel中。一个buffer的position和limit之间的内容才会被写入。因此,如果一个BUffer有128字节的容量,但实际只有58个字节的数据,那只有这58个字节会被写入到Channel中。因此,Gathering Write适用于大小不定的消息,这点倒是和Scattering Read不同。

你可能感兴趣的文章
torch.cuda.is_available()返回False的解决办法
查看>>
BITVehicle_Dataset数据集转换
查看>>
将视频转存成图片小代码
查看>>
ImportError: cannot import name ‘Line 解决方法
查看>>
Ubuntu 创建/删除虚拟环境
查看>>
deepsort算法中绘制轨迹部分的代码【记录】
查看>>
C++程序设计作业--坦克大战[分享]
查看>>
Uuntu20.04出现“qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in...已放弃 (核心已转储)”问题解决记录
查看>>
Linux系统常用的基本操作记录
查看>>
ZeroDivisionError: integer division or modulo by zero解决记录
查看>>
使用软链接放置数据集
查看>>
网页中的编码和Python处理
查看>>
1.2初识输入输出
查看>>
1.3注释简介
查看>>
1.4控制流
查看>>
2 变量和基本类型
查看>>
3 字符串,向量和数组
查看>>
4 表达式
查看>>
5 语句
查看>>
string
查看>>