参考:http://ifeve.com/java-nio-scattergather/
原文地址
目录
- Java NIO教程
- Java NIO 教程(一) 概述
- Java NIO 教程(二) Channel
- Java NIO 教程(三) Buffer
- Java NIO 教程(四) Scatter/Gather
- Java NIO 教程(五) 通道之间的数据传输
- Java NIO 教程(六) Selector
- Java NIO 教程(七) FileChannel
- Java NIO 教程(八) SocketChannel
- Java NIO 教程(九) ServerSocketChannel
- Java NIO 教程(十) 非阻塞式服务器
- Java NIO 教程(十一) Java NIO DatagramChannel
- Java NIO 教程(十二) Pipe
- Java NIO 教程(十三) Java NIO vs. IO
- Java NIO 教程(十四) Java NIO Path
- Java NIO 教程(十五) Java NIO Files
- Java NIO 教程(十六) Java NIO AsynchronousFileChannel
Java NIO开始支持scatter
/gather
,scatter
/gather
用于描述从Channel
(译者注:Channel
在中文经常翻译为通道)中读取或者写入到Channel
的操作。
从Channel中分散(scatter)读取,是指在读操作时将读取的数据写入多个buffer
中。因此,从Channel
中读取的数据将“分散(scatter
)”到多个Buffer
中。
聚集(gather)写入一个Channel,是指在写操作时将多个buffer
的数据写入同一个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);
//此处写数据到buffer中
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);
buffers
数组是write()
方法的输入参数,write()
方法会按照buffer
在数组中的顺序,将数据写入到channel
,注意只有position
和limit
之间的数据才会被写入。因此,如果一个buffer
的容量为128byte,但是仅仅包含58byte的数据,那么这58byte的数据将被写入到channel
中。因此与Scattering Reads
相反,Gathering Writes
能较好的处理动态消息。
网友评论