作者:Jakob Jenkov   译者:郭蕾

Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。

分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。

聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将多个Buffer中的数据“聚集(gather)”后发送到Channel。

scatter / gather经常用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体。

Scattering Reads

Scattering Reads是指数据从一个channel读取到多个buffer中。如下图描述:

代码示例如下:

ByteBuffer header = ByteBuffer.allocate(128);

ByteBuffer body= ByteBuffer.allocate(1024);

ByteBuffer[] bufferArray={ header, body };

channel.read(bufferArray);

注意buffer首先被插入到数组,然后再将数组作为channel.read() 的输入参数。read()方法按照buffer在数组中的顺序将从channel中读取的数据写入到buffer,当一个buffer被写满后,channel紧接着向另一个buffer中写。

Scattering Reads在移动下一个buffer前,必须填满当前的buffer,这也意味着它不适用于动态消息(译者注:消息大小不固定)。换句话说,如果存在消息头和消息体,消息头必须完成填充(例如 128byte),Scattering Reads才能正常工作。

Gathering Writes

Gathering Writes是指数据从多个buffer写入到同一个channel。如下图描述:

代码示例如下:

ByteBuffer header = ByteBuffer.allocate(128);

ByteBuffer body= ByteBuffer.allocate(1024);//write data into buffers

ByteBuffer[] bufferArray={ header, body };

channel.write(bufferArray);

buffers数组是write()方法的入参,write()方法会按照buffer在数组中的顺序,将数据写入到channel,注意只有position和limit之间的数据才会被写入。因此,如果一个buffer的容量为128byte,但是仅仅包含58byte的数据,那么这58byte的数据将被写入到channel中。因此与Scattering Reads相反,Gathering Writes能较好的处理动态消息。

java nio 系列教程 四_Java NIO系列教程(四) Scatter/Gather相关推荐

  1. java nio 对消息分片_Java NIO:应用

    Java NIO 是一种非阻塞的.面向块而非字节的 IO 方式.虽然 Java 的传统 IO 也进行了一些基于 NIO 的改造,NIO 仍然能够带来许多优势. 面向流的 IO 方便我们一个字节一个字节 ...

  2. 人工智能 java 坦克机器人系列: 强化学习_Java坦克机器人系列强化学习

    <Java坦克机器人系列强化学习>由会员分享,可在线阅读,更多相关<Java坦克机器人系列强化学习(13页珍藏版)>请在人人文库网上搜索. 1.Java 坦克机器人系列 强化学 ...

  3. java.nio包网络编程_Java NIO网络编程

    来自孙卫琴的Java网络编程,第四章,这段代码感觉有问题啊,第45行的 synchronized(gate){} 这句代码怎么理解啊,可以这样写吗? 1.[文件] EchoServer.java ~  ...

  4. java nio 追加写文件_Java NIO在文件末尾追加数据

    [java]代码库import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import ja ...

  5. java用NIO实现文件传输_Java Nio 实现文件的传输

    使用Java Nio实现文件的传输 1.ServerSocket.java package ch2; import java.io.File; import java.io.FileNotFoundE ...

  6. java nio 追加写文件_Java NIO写入文件

    用NIO写文件,总结一下,主要有如下步骤: 1.打开通道. 2.包装到缓冲区. 3.写入文件. 4.不忘记关闭通道,关闭流.package what21.nio; import java.io.Fil ...

  7. java 取栈顶元素_java集合系列(7)Stack

    这篇文章开始介绍Stack.从名字看他就是一个stack,因此具有数据结构中栈的一般特性(后进先出),平时用起来相对较多一点,但是也是非常简单.这篇文章我们将从源码的角度来分析一下Stack. OK, ...

  8. java面向对象编程集合边框_Java学习系列(七)Java面向对象之集合框架详解(上)

    Java集合 有时也将集合称为容器类,它的作用就是用来"装对象"的.这里要注意的是集合也可以是对象.下面先看一张图: HashSet:底层用一个数组存元素 --而且这个数组的长度永 ...

  9. java多线程的join方法_java多线程系列_join方法的使用(5)

    在上面的例子中多次使用到了Thread类的join方法.我想大家可能已经猜出来join方法的功能是什么了.对,join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方 ...

最新文章

  1. 2021科大讯飞-车辆贷款违约预测赛事 Top1方案!
  2. 自然语言处理(NLP)之使用LSTM进行文本情感分析
  3. PAT 1052. 卖个萌 (20)
  4. 从外网给新建的Exchange 2007/2010分发通讯组发邮件失败
  5. timer控件的使用
  6. python中的文件数据保存
  7. linux收回用户执行权限,Linux之文件权限管理命令
  8. 敏捷开发一千零一问系列之十三:故事点好还是人天好?
  9. 制作 maxdos 启动盘 Linux 安装盘
  10. 祖冲之算法(ZUC-128)C语言实现
  11. 用Python写几个小游戏(附源码)
  12. 新一代智能会议中控系统
  13. 库和计算机硬盘什么区别是什么,电脑内存和硬盘容量的区别是什么
  14. 博弈论大师---纳什
  15. 爱思国际获戈壁创投数百万美元Pre-A 轮融资,意做菲律宾的分众传媒
  16. matlab之nargin函数
  17. dell r630 配置raid_在 Dell PowerEdge 服务器中安装和配置 RAID
  18. Java使用mpxj导入.mpp格式的Project文件(甘特图)
  19. 有梦想就去追,程序员辞职组乐队被老板资助
  20. PHP explode函数用法详解

热门文章

  1. 面试问题:SpringMVC的执行流程
  2. 刚接触Python,这么多IDE我该怎么选
  3. Flask框架——上下文、flask_script扩展
  4. 2020年 Google 开发者大会可以预约了
  5. 同步请求和异步请求的区别
  6. 强化学习《基于价值 - Q-Learning》
  7. leetcode - 121.买卖股票的最佳时机
  8. 软硬件协同漏洞防护技术【会议】
  9. Java中矩阵运算(math3的使用)
  10. SH760模态分析-多种解析与数字计算方法