Java NIO (四) Scatter/Gather
2015-11-25 14:37
465 查看
Java NIO Scatter/Gather
Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。Scatter - 分散
从Channel中读取,是指在读操作时,将读取的数据写入多个buffer中,因此,Channel将channel中的数据分散到多个Buffer中。Gather - 聚集
写入Channel,是指在写操作时,将多个buffer的数据写入同一个Channel,因此,Channel将多个Buffer中的数据聚集然后发送到Channel。scatter/gather经常用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便地处理消息头和消息体。
Scattering Reads
指的是,将数据从一个channel中读取到多个buffer中:![](http://ifeve.com/wp-content/uploads/2013/06/scatter.png)
示例代码:
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,如下图所示:![](http://ifeve.com/wp-content/uploads/2013/06/gather.png)
示例代码:
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能较好的处理动态消息。
相关文章推荐
- Android Studio逆向工程——向Eclipse迁移
- Java中基本的数学函数
- spring mvc Controller
- Java注解
- Eclipse快捷键 10个最有用的快捷键
- struts2 错误总结 自己会不断更新中。。。。。
- java.io.tmpdir 所指地址
- Java中需要注意的3个常见集合错误
- 【java基础】JPA详解(part2)
- java怎么把数据库的内容导出到excel表里面
- java匹配电话格式的正则表达式
- 【Java基础】JPA详解(part1)
- FileInputStream 读取txt文件内容
- Java RTTI初探
- 关于Java中的paint,repaint,update三个方法的关系
- Java 基础问题整理(更新中)
- Java中的Get和Post请求,使用万网接口判断域名是否已被注册
- java日期在今天的基础上加一个月。并计算时间相差天数
- 冒泡排序的java实现
- eclipse c c indexer has encountered a problem