Java NIO 分散/聚集

1 分散/聚集的介绍

Java NIO带有内置的分散/聚集功能。分散/聚集是在读取和写入Channel中使用的概念。

从Channel分散读取是将数据读取到多个缓冲区中的读取操作。因此,通道将数据从通道“分散”到多个缓冲区中。

对Channel的聚集写入是一种将来自多个缓冲区的数据写入单个通道的写入操作。因此,通道将来自多个缓冲区的数据“聚集”到一个Channel中。

在需要分别处理传输数据的各个部分的情况下,分散/聚集非常有用。例如,如果消息由标题和正文组成,则可以将标题和正文保留在单独的缓冲区中。这样做可以使您更轻松地分别使用标题和正文。

2 分散读取

“分散读取”将数据从单个通道读取到多个缓冲区中。以下为原理图:

Java NIO:分散读取

以下代码示例,表示如何执行分散读取:

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

ByteBuffer[] bufferArray = { header, body };

channel.read(bufferArray);

注意:如何将缓冲区首先插入数组,然后将数组作为参数传递给 channel.read()方法。read()执行后,该方法按照缓冲区在阵列中出现的顺序从通道写入数据。一旦缓冲区已满,通道将继续填充下一个缓冲区。

分散读取会先填充一个缓冲区,然后再移动到另一个缓冲区,这意味着它不适合动态调整消息大小。换句话说,如果您有标头和正文,并且标头是固定大小(例如128字节),则分散读取效果很好。

3 聚集写入

“聚集写入”将来自多个缓冲区的数据写入单个通道。以下为原理图:

Java NIO:聚集写入

以下代码,表示如何执行聚集写入:

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

//write data into buffers

ByteBuffer[] bufferArray = { header, body };

channel.write(bufferArray);

缓冲区数组被传递到write()方法中,该方法按照缓冲区在数组中遇到的顺序写入缓冲区的内容。仅写入缓冲区的位置和极限之间的数据。因此,如果缓冲区的容量为128个字节,但仅包含58个字节,则只有58个字节从该缓冲区写入通道。因此,与分散读取相比,聚集写入对于动态大小的消息部分可以很好地工作。

热门文章

优秀文章