Java NIO 分散/聚集

来源:互联网 发布:数据库工程师发展怎样 编辑:程序博客网 时间:2024/04/29 06:22

Java NIO内部提供了对scatter/gather的支持。Scatter/Gather是用来向channel写数据或从channel读数据的一种方式。

从一个通道分散(scattering)读是一个向一个或多个缓冲区读入数据的读操作。因此,将一个通道里的数据分散读入多个缓冲区。

向一个通道聚集(gather)写入是一个从一个或多个缓冲区向单个通道写入数据的写操作。因此,将一个或多个缓冲区的数据聚集(gather)写入一个通道。

当你需要将数据分开处理的时候Scatter/Gather将会派上用场。例如,一个消息包含头部和主体,你可能想将头部和主体放在不同的缓冲区中,使用Scatter/Gather将会使这样的工作变得容易。

Scattering Reads

一个"scattering read"将单个通道的数据读入到多个缓冲区。
下面是一个使用Scattering read的示例
ByteBuffer header = ByteBuffer.allocate(128);ByteBuffer body   = ByteBuffer.allocate(1024);ByteBuffer[] bufferArray = { header, body };channel.read(buffers);
这些缓冲区首先被封装成一个数组,然后作为参数传入channel.read()方法。channel.read()方法将通道中数据顺序写入到数组中存储的缓冲区,但第一个缓冲区写满时,通道会继续移动到第二个缓冲区进行填充。
当第一个缓冲区填满时,才会移动到第二个缓冲区进行填充,造成了scattering read无法用来处理动态大小的消息部分。换句话说,如果你有一个头部和一个主题,然后头部有固定的大小,scattering read才能很好的工作。

Gathering Writes

"gathering write"将多个缓冲区的数据写入单个通道。
下面是一个使用gathering write的示例:
ByteBuffer header = ByteBuffer.allocate(128);ByteBuffer body   = ByteBuffer.allocate(1024);//write data into buffersByteBuffer[] bufferArray = { header, body };channel.write(buffers);

缓冲区数组被传入给channel.write()方法,缓冲区的数据会按照在数组中的顺序写入到通道。只有缓冲区中position和limit之间的数据会被写到缓冲区。因此,如果一个缓冲区的容量大小为128字节,但只包含58个字节的数据,只有这58个字节从缓冲区写入通道。所以,gathering write可以用来处理动态大小的消息部分,这也是gathering write区别于scattering read的地方。
0 0
原创粉丝点击