Java NIO有内置的分散/聚合(Scatter/Gather)功能。分散聚合的概念应用场景为从channel读数据,向channel中写数据。
分散的从channel读取数据,是将数据读取至多个buffer中的操作。
那么聚合就是将多个buffer数据写入到一个channel中。
分散聚合功能在许多场景是很实用的。例如一条message,它由body和header组成,那么你需要将body和header分别存放在两个buffer中。这么做可以让你更方便的使用header和body。
分散读取
从单个channel中将数据读取至多个buffer。下面是示意图:
下面的代码,展示了如何进行具体的操作:
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,下面是示意图:
下面是相关的代码示例:
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教程目录贴地址