最后更新时间:2015-09-02
Java NIO自带的内置分散/聚集支持。分散/聚集是使用在从channel中读,以及写channel的概念。
从一个channel的一个分散读是读数据进入不止一个buffer的一个读操作。因此,这个channel的“分散”这些数据从这个channel中到多个buffer中。
一个聚集写到一个channel中是来自于不止一个buffer写数据进入一个单独的channel的一个写操作。因此,这个channel的“聚集”这个数据从多个buffer中到一个channel中。
分散/聚集在这些场景下是真的实用的:你需要单独的同传输数据的跟个部分进行工作。例如,如果一个消息包含一个头部和主题,你可能会保持头部和主题在分离的buffer中。这样做,可能对于你更简单的单独与头部和主题去工作。
分散读取
一个“分散读取”从一个单独的channel中读取数据到多个buffer中。
这里有一个“分散”原理的图解:
这里有一个代码实例,显示如何执行一个分散读取:
ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer[] bufferArray = { header, body }; channel.read(bufferArray);
事实上,分散读取在移动到下一个buffer中之前将会装完一个buffer,意味着对于动态大小的消息部分是不合适的。换句话说,如果你有一个头和体,并且这个头是固定大小的(例如是128字节),然后这个分散读将会工作的很好。
聚集写
一个“聚集写”是从多个buffer中写数据进入一个channel。这里有一个原理的图解。
这里有一个代码实例来显示怎样执行一个聚集写:
ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); //write data into buffers ByteBuffer[] bufferArray = { header, body }; channel.write(bufferArray);
翻译地址:http://tutorials.jenkov.com/java-nio/scatter-gather.html