5. Java NIO Scatter/Gather(分散/聚合

2018-04-24  本文已影响0人  kopshome

Java NIO有内置的分散/聚合(Scatter/Gather)功能。分散聚合的概念应用场景为从channel读数据,向channel中写数据。

分散的从channel读取数据,是将数据读取至多个buffer中的操作。

那么聚合就是将多个buffer数据写入到一个channel中。

分散聚合功能在许多场景是很实用的。例如一条message,它由body和header组成,那么你需要将body和header分别存放在两个buffer中。这么做可以让你更方便的使用header和body。

分散读取

从单个channel中将数据读取至多个buffer。下面是示意图:

image

下面的代码,展示了如何进行具体的操作:


ByteBuffer header = ByteBuffer.allocate(128);

ByteBuffer body = ByteBuffer.allocate(1024);

ByteBuffer[] bufferArray = { header, body };

channel.read(bufferArray);

注意buffer首先是如何放入数组的,然后bufferArray作为参数传入到read()方法中。read()方法将数据从channel按顺序写入到数组中的buffer中。当第一个buffer写满后channel会自动去写下一个buffer。

实际上,在移动到下一个buffer之前,分散读取必须填充完当前的缓冲区,这意味着它不适合动态message的读取(即message不固定大小)。换句话说,假如你有一个header和body,然后header是固定大小(例如 128 bytes),那么使用分散读取是没有问题的。

聚合写入

聚合读取是把数据从多个buffer写入到同一个channel,下面是示意图:

image

下面是相关的代码示例:


ByteBuffer header = ByteBuffer.allocate(128);

ByteBuffer body = ByteBuffer.allocate(1024);

//write data into buffers

ByteBuffer[] bufferArray = { header, body };

channel.write(bufferArray);

bufferArray数组作为参数传入到write()方法,数组中的buffer,按照顺序写入到channel中。buffer中的数据只有position和limit之间的数据可以写出。所以,如果一个buffer的容量是128 byte,但是只存了58 byte的数据,那么只会有58 byte的数据会被写出。所以与分散读取相反,聚合写入能较好的处理动态消息。


想要查看此教程的目录请点击:Java NIO教程目录贴地址

上一篇下一篇

猜你喜欢

热点阅读