原文连接:http://tutorials.jenkov.com/java-nio/scatter-gather.html
Jave NIO支持scatter/gather(分散/聚集),scatter/gather的概念用于描述从通道里面读取和写入通道。
从通道里面分散读是在读操作的时候,读取的数据被写入多个buffer中。因此,通道“scatters”将数据从通道写入多个buffer中。
聚集写入通道是在写操作时,写入多个buffer的数据到一个通道,因此,通道“gathers”将数据从多个buffer中写入通道。
scatter/gather最实用的情况是:需要传输的数据各个部分要分开:例如:一个由消息头和消息体组成的消息,消息体和消息头可能被分开在不同的buffer中,这样处理后,将使得你分开在消息头和消息体更方便的做处理。
Scattering Reads
“Scattering Reads”:数据从一个通道读取到多个buffer,图示描述如下:
代码示例如下:
ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer[] bufferArray = { header, body }; channel.read(buffers);
注意buffers的首先包含在一个数组,然后再将数组作为channel.read() 的参数。read()方法从通道里面写数据到按照在数组中的顺序写入到buffers,当第一个buffer写满后,通道将会填充下个buffer。
事实上Scattering Reads在移动下一个buffer前,必须填充完毕当前的buffer,这意味着它不适应用于消息部分是动态大小的。也就是说,如果存在消息头和消息体,消息头必须完成填充(例如 128byte),Scattering Read才能工作好。
Gathering Writes
"gathering write" 数据从多个buffer写入到通道里面,图示如下:
代码示例入下:
ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); //write data into buffers ByteBuffer[] bufferArray = { header, body }; channel.write(buffers);
buffers数组作为write()方法 的入参,按照数组中的顺序,一个个将buffer的内容写入。仅仅将buffer position 与 limit 之间的元素写入。因此,如果一个buffer的capacity 为128byte,仅仅包含58byte数据,58byte将被从buffer中写入到通道中。因此与Scattering Reads相反,Gathering Writes在动态的消息部分也能处理好。
相关推荐
Java语言基础教程-Java NIO流篇2Java语言基础教程-Java NIO流篇2
01-Java NIO-课程简介.mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-ServerSocketChannel.mp4 09-Java NIO-Channel-SocketChannel.mp4 ...
01-Java NIO-课程简介.mp4 02-Java NIO-概述.mp4 03-Java NIO-Channel-概述.mp4 04-Java NIO-Channel-FileChannel(介绍和示例).mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel...
Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) FileChannel Java NIO系列教程(八) SocketChannel Java NIO系列教程...
Java语言基础教程-Java NIO流篇1Java语言基础教程-Java NIO流篇1
Java语言基础教程-Java NIO流篇3Java语言基础教程-Java NIO流篇3
Java语言基础教程-Java NIO流篇.txt 网盘永久链接 为方便java nio学习爱好者而上传
多线程精品资源--Java NIO+多线程实现聊天室
2021最新-Java NIO视频教程.txt打包整理.zip
包含翻译后的API文档:xnio-nio-3.8.0.Final-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.jboss.xnio:xnio-nio:3.8.0.Final; 标签:jboss、xnio、nio、中文文档、jar包、java; 使用方法:解压翻译后的API...
yubo-java-nioNIO 直接缓冲区 VS 非直接缓冲区直接缓冲区1、直接... Scatter/Gather 应该与直接 ByteBuffer 一起使用,以从本机 I/O 中获得最大优势。Java 引用对象类型1、JCP java并发实践JCP AQS - 抽象排队同步器
JAVA NIO学习资料JAVA NIO学习资料
Java-NIO-Netty框架入门学习。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
NULL 博文链接:https://1358440610-qq-com.iteye.com/blog/2115715
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
自JDK-1.4开始的新I/O(NIO)为Java程序员提供了新的高效率的I/O能力。效率的提高主要来源于一个新的内存共享技术。传统上,Java内存来自JVM的堆,Native code(JNI)不能很好的与Java code共享这些Java内存,因为Native ...
Java-NIO-系列教程
教程内容涵盖:阻塞和非阻塞IO、Channel通道、Buffer缓冲区、Selector选择器、Pipe管道、FileLock文件锁,以及Path、Files、异步FileChannel和Charset字符编码等,并通过一个多人聊天室的综合案例,把所有的NIO知识...