Java Nio 五、分散/聚集

最后更新时间:2015-09-02

Java NIO自带的内置分散/聚集支持。分散/聚集是使用在从channel中读,以及写channel的概念。

从一个channel的一个分散读是读数据进入不止一个buffer的一个读操作。因此,这个channel的“分散”这些数据从这个channel中到多个buffer中。

一个聚集写到一个channel中是来自于不止一个buffer写数据进入一个单独的channel的一个写操作。因此,这个channel的“聚集”这个数据从多个buffer中到一个channel中。

分散/聚集在这些场景下是真的实用的:你需要单独的同传输数据的跟个部分进行工作。例如,如果一个消息包含一个头部和主题,你可能会保持头部和主题在分离的buffer中。这样做,可能对于你更简单的单独与头部和主题去工作。

分散读取

一个“分散读取”从一个单独的channel中读取数据到多个buffer中。

这里有一个“分散”原理的图解:

Java Nio 五、分散/聚集_第1张图片

这里有一个代码实例,显示如何执行一个分散读取:

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。这里有一个原理的图解。

Java Nio 五、分散/聚集_第2张图片

这里有一个代码实例来显示怎样执行一个聚集写:

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


你可能感兴趣的:(java,&,JVM,Java,NIO)