前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java NIO 系列学习 05 - Scatter and Gather

Java NIO 系列学习 05 - Scatter and Gather

作者头像
许杨淼淼
发布2019-12-29 20:01:23
3940
发布2019-12-29 20:01:23
举报
文章被收录于专栏:醉程序醉程序

Java NIO 提供了内置的Scatter和Gather支持。Scatter和Gatter是用于读写Channel的概念。

Scatter从一个Channel中读取数据,然后写到多个Buffer中。

Gather从多个Buffer中拿到数据,然后写到一个Channel中。

在我们需要分开处理传输数据的各个部分时很有用。比如,一条消息由头部和正文组成,我们需要单独对头部和正文的内容进行分开处理,就可以把头部和正文单独存储在Buffer中。

Scattering Reader

scattering read: 从一个Channel中读取数据,”分散”数据给多个Buffer。 下面是一个示例图

下面是一个代码示例

代码语言:javascript
复制
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

ByteBuffer[] bufferArray = { header, body };

channel.read(bufferArray);

这里需要注意的也就一点:read()方法在把数据写到多个buffer时,是一个buffer写满后再写到另一个buffer中去的。也就是说多个buffer的内容按顺序拼接起来的是一个channel的内容,并不是每一个buffer都是一份copy。

buffer的容量大小一旦确定,在read时是不能动态调整的(第一个buffer写满之后才会写第二个buffer),因此,scattering read 适用于像例子中的头部大小固定的。

Gathering Writer

gathering write: 从多个buffer中拿到数据,”聚集”写到一个channel。 下面是一个示例图

下面是一个代码示例

代码语言:javascript
复制
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

//write data into buffers

ByteBuffer[] bufferArray = { header, body };

channel.write(bufferArray);

需要注意的是:如果一个buffer声明了容量是128,但实际只有64的话,写到channel里的也是64,而不会把多余的空白写进去。因此是动态的

参考

  1. Java NIO Scatter and Gather
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年4月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Scattering Reader
  • Gathering Writer
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档