专栏首页醉程序Java NIO 系列学习 05 - Scatter and Gather

Java NIO 系列学习 05 - Scatter and Gather

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

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

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

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

Scattering Reader

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

下面是一个代码示例

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。 下面是一个示例图

下面是一个代码示例

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 造了个轮子 XML 2 JSON

    许杨淼淼
  • 设计模式学习 - 工厂模式

    根据不同的对象,提供不同的工厂,然后由客户端来选择对应的工厂。这也是与简单工厂模式的不同的地方。

    许杨淼淼
  • 学习SpringBoot系列 -04- 多数据源 + Druid

    前面两个小节记录下了多数据源和 Druid ,本节综合起来,记录下使用 Druid 结合多数据源。跟实际项目更贴切一些。

    许杨淼淼
  • netty了解与应用

    学习netty之前,必须先了解下什么是nio,关于nio的教程网上非常多,和传统io的比较,优势,如何使用,各个方面都有比较细致的分析。

    sucl
  • 5种数据科学家必须知道的特征选择方法

    数据决定了模型的上限,算法只能无线逼近这个上限。模型好坏很大程度上还是取决于数据的质量、特征的选择。

    用户2769421
  • 「mysql优化专题」详解引擎(InnoDB,MyISAM)的内存优化攻略?(9)

    InnoDB用一块内存区域做I/O缓存池,该缓存池不仅用来缓存InnoDB的索引块,而且也用来缓存InnoDB的数据块。

    java进阶架构师
  • 利用js文件进行渗透

    当我们访问的站点只是一个简单的登录页面时,我们应充分利用涉及到的JavaScript脚本函数或文件。

    贝塔安全实验室
  • C++接口继承与实现继承的区别和选择

    《Effective C++》条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现; ...

    Dabelv
  • 用Python爬取b站弹幕,看大家还会接受《爱情公寓5》吗?

    尽管抄袭傍身,也没能阻挡《爱情公寓5》进击的脚步。 最近爱情公寓电视剧微博发布了长达8分钟的揭幕视频,官宣新季将在2020正式开播。 几位主演纷纷转发宣传,将#...

    朱小五
  • Java代码常见的十种错误

    每一个程序员在编写代码的过程中都免不了出现错误或是小的失误,这些小的错误和失误往往使得程序员还得返工。那么,如何才能尽量避免这些错误的发生呢?笔者总结只有在日常...

    庞小明

扫码关注云+社区

领取腾讯云代金券