Java NIO(五)Scatter / Gather

Java NIO带有内置的分散/聚集支持。 分散/聚集是用于阅读和写入频道的概念。

从通道读取散射是一种读取操作,将数据读取到多个缓冲区中。 因此,通道将来自通道的数据“分散”到多个缓冲区中。

写入通道的写入操作是将来自多个缓冲区的数据写入单个通道的写入操作。 因此,通道将来自多个缓冲区的数据“收集”到一个通道中。

如果您需要单独处理传输数据的各个部分,Scatter / Gather可能非常有用。 例如,如果一个消息由一个头部和一个主体组成,你可以将头部和主体保存在不同的缓冲区中。 这样做可能会使您更容易分开处理标题和正文。

Scattering Reads 散射读取

“散读”将数据从单个通道读入多个缓冲区。 这是这个原则的例证:

这是一个散点图的例子:
image.png

这里是一个代码示例,显示如何执行散射读取:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

ByteBuffer[] bufferArray = { header, body };

channel.read(bufferArray);

注意如何将缓冲区首先插入到数组中,然后将数组作为参数传递给channel.read()方法。 read()方法会按照缓冲区出现在数组中的顺序写入通道中的数据。 一旦缓冲区满了,通道继续填充下一个缓冲区。在转移到下一个之前,散列读取填充一个缓冲区的事实意味着它不适合动态调整大小的消息部分。 换句话说,如果你有一个头部和一个主体,并且头部是固定的大小(例如128字节),那么散射阅读工作正常。

Gathering Writes

“收集写入”将来自多个缓冲区的数据写入单个通道。 这是这个原则的例证:

这里是一个代码示例,显示如何执行一次聚集写入:

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

//write data into buffers

ByteBuffer[] bufferArray = { header, body };

channel.write(bufferArray);

将缓冲区数组传递到write()方法,该方法按照在数组中遇到的顺序写入缓冲区的内容。 只有缓冲区的位置和限制之间的数据被写入。 因此,如果缓冲区的容量为128字节,但只包含58个字节,则只有58个字节从该缓冲区写入该信道。 因此,聚集写入与动态大小的消息部分一起工作良好,与散列读取相反。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转自 http://www.ibm.com/developerworks/cn/education/java/j-...
    抓兔子的猫阅读 2,503评论 0 22
  • Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java I...
    JackChen1024阅读 7,961评论 1 143
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,872评论 11 349
  • (转载说明:本文非原创,转载自http://ifeve.com/java-nio-all/) Java NIO: ...
    数独题阅读 869评论 0 3
  • 李佳蔚11月6日第六次读书打卡。今天读了《三国演义》中的三顾茅庐那篇章。刘备听水镜先生说,得到凤雏和卧龙就可平天下...
    李佳蔚0415阅读 198评论 0 0

友情链接更多精彩内容