【译】Java NIO Scatter / Gather

落花浮王杯 提交于 2020-01-07 17:56:20

Java NIO原生支持scatter和gather。Scatter/Gather是从channel中读取或者是向channel中写入时的概念。

一个scatter类型的reading操作,就是一次读操作中会读取多个buffer。

一个gather类型的writing操作,就是一次向channel中写入多个buffer。

在需要分别处理传输数据的各个部分的情况下,Scatter/Gather非常有用。例如,一个消息包含一个header和一个body,你可能需要把header和body分成两个buffer来处理。这样可能会使工作更加容易。

Scattering Reads

 

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

ByteBuffer[] bufferArray = { header, body };

channel.read(bufferArray);

注意,buffer加入数组的顺序就是传递给channel的处理顺序。一旦buffer读满了,channel就会移动到下一个buffer。

事实上scattering的读操作,直到一个buffer满了才会移动到下一个buffer的特性,导致它不适合动态大小的buffer。换言之,如果你有一个固定大小128bytes的buffer,那么scattering会工作正常。

Gathering Writes

一个 “gathering write”的写操作,如图所示:

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字节(这个大小是指position到limit的大小),则只有58字节从该缓冲区写入通道。因此和Scatter操作相比,Gathering操作可以很好的处理动态大小buffer。

 

下一篇:【译】Java NIO Channel to Channel Transfers

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!