Java NIO分散/收集

时间:2020-01-09 10:36:16  来源:igfitidea点击:

Java NIO带有内置的分散/收集支持。散布/聚集是在读取和写入通道中使用的概念。

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

收集到通道的写操作是一种写操作,它将来自多个缓冲区的数据写到单个通道中。因此,通道将来自多个缓冲区的数据"收集"到一个通道中。

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

分散读取

"分散读取"将数据从单个通道读取到多个缓冲区中。

这是一个代码示例,显示了如何执行分散读取:

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

ByteBuffer[] bufferArray = { header, body };

channel.read(bufferArray);

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

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

聚集写

"聚集写入"将来自多个缓冲区的数据写入单个通道。

这是一个代码示例,显示了如何执行收集写入:

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个字节从该缓冲区写入通道。因此,与分散读取相比,聚集写入对于动态大小的消息部分可以很好地工作。