Java Nio 五、分散/聚集
2016-01-03 20:36
337 查看
最后更新时间:2015-09-02
Java NIO自带的内置分散/聚集支持。分散/聚集是使用在从channel中读,以及写channel的概念。
从一个channel的一个分散读是读数据进入不止一个buffer的一个读操作。因此,这个channel的“分散”这些数据从这个channel中到多个buffer中。
一个聚集写到一个channel中是来自于不止一个buffer写数据进入一个单独的channel的一个写操作。因此,这个channel的“聚集”这个数据从多个buffer中到一个channel中。
分散/聚集在这些场景下是真的实用的:你需要单独的同传输数据的跟个部分进行工作。例如,如果一个消息包含一个头部和主题,你可能会保持头部和主题在分离的buffer中。这样做,可能对于你更简单的单独与头部和主题去工作。
分散读取
一个“分散读取”从一个单独的channel中读取数据到多个buffer中。
这里有一个“分散”原理的图解:
这里有一个代码实例,显示如何执行一个分散读取:
注意,这个buffer首先是如何插入到一个数组中,然后这个数组作为一个参数传递到了channel.read()方法中。这个read()方法然后从channel中写数据到在发生在数组中排好序的buffer中。一旦一个buffer满了,这个channel将会移动到下一个buffer中。
事实上,分散读取在移动到下一个buffer中之前将会装完一个buffer,意味着对于动态大小的消息部分是不合适的。换句话说,如果你有一个头和体,并且这个头是固定大小的(例如是128字节),然后这个分散读将会工作的很好。
聚集写
一个“聚集写”是从多个buffer中写数据进入一个channel。这里有一个原理的图解。
这里有一个代码实例来显示怎样执行一个聚集写:
buffer的一个数组被传递给了write()方法,这个方法写他们在数组中遇到的接下来的buffer的内容。只是这些数据在buffer的position和limit直接被写。因此,如果一个buffer有一个128字节的容量,但是只包含了58个字节,只有58个字节可以从buffer中写到channel。因此,一个聚集写操作通过动态可变大小的消息部分会工作的很好,跟分散读取正好相反。
翻译地址:http://tutorials.jenkov.com/java-nio/scatter-gather.html
Java NIO自带的内置分散/聚集支持。分散/聚集是使用在从channel中读,以及写channel的概念。
从一个channel的一个分散读是读数据进入不止一个buffer的一个读操作。因此,这个channel的“分散”这些数据从这个channel中到多个buffer中。
一个聚集写到一个channel中是来自于不止一个buffer写数据进入一个单独的channel的一个写操作。因此,这个channel的“聚集”这个数据从多个buffer中到一个channel中。
分散/聚集在这些场景下是真的实用的:你需要单独的同传输数据的跟个部分进行工作。例如,如果一个消息包含一个头部和主题,你可能会保持头部和主题在分离的buffer中。这样做,可能对于你更简单的单独与头部和主题去工作。
分散读取
一个“分散读取”从一个单独的channel中读取数据到多个buffer中。
这里有一个“分散”原理的图解:
这里有一个代码实例,显示如何执行一个分散读取:
ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer[] bufferArray = { header, body }; channel.read(bufferArray);
注意,这个buffer首先是如何插入到一个数组中,然后这个数组作为一个参数传递到了channel.read()方法中。这个read()方法然后从channel中写数据到在发生在数组中排好序的buffer中。一旦一个buffer满了,这个channel将会移动到下一个buffer中。
事实上,分散读取在移动到下一个buffer中之前将会装完一个buffer,意味着对于动态大小的消息部分是不合适的。换句话说,如果你有一个头和体,并且这个头是固定大小的(例如是128字节),然后这个分散读将会工作的很好。
聚集写
一个“聚集写”是从多个buffer中写数据进入一个channel。这里有一个原理的图解。
这里有一个代码实例来显示怎样执行一个聚集写:
ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); //write data into buffers ByteBuffer[] bufferArray = { header, body }; channel.write(bufferArray);
buffer的一个数组被传递给了write()方法,这个方法写他们在数组中遇到的接下来的buffer的内容。只是这些数据在buffer的position和limit直接被写。因此,如果一个buffer有一个128字节的容量,但是只包含了58个字节,只有58个字节可以从buffer中写到channel。因此,一个聚集写操作通过动态可变大小的消息部分会工作的很好,跟分散读取正好相反。
翻译地址:http://tutorials.jenkov.com/java-nio/scatter-gather.html
相关文章推荐
- Struts2和hibernate3的简单应用-登录验证
- Myeclipse 10.7 android(安卓) 开发环境搭建
- java配置环境变量
- 【jersey】 spring 整合jersey 实现RESTful webservice
- MyEclipse代码不能自动补全的解决办法
- Java关键字(四)static关键字(静态代码块)
- struts2学习
- springMVC的Restful接口实现
- 【Android Studio使用教程5】使用SDK Manager时, SDK下载更新不了的解决方案(eclipse 也适用)
- 图文介绍如何在Eclipse统计代码行数
- No result defined for action com.buaa.spring_test.action.TestAction and result input
- java 将list 按长度分割
- Java线程池使用说明
- Gradle中给SpringBoot指定active profile
- Java — 多线程
- 实例化Spring容器,实例化bean
- JAVA构造函数在超类与子类定义鲁波总结
- Spring基础概念
- java获取Class对象的几种方法
- eclipse 添加jar包几种方式对比