美文网首页
5. Java NIO Scatter/Gather(分散/聚合

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

作者: kopshome | 来源:发表于2018-04-24 17:23 被阅读0次

    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教程目录贴地址

    相关文章

      网友评论

          本文标题:5. Java NIO Scatter/Gather(分散/聚合

          本文链接:https://www.haomeiwen.com/subject/piwjlftx.html