Java NIO(五)Scatter / Gather

简介: Java NIO带有内置的分散/聚集支持。 分散/聚集是用于阅读和写入频道的概念。从通道读取散射是一种读取操作,将数据读取到多个缓冲区中。 因此,通道将来自通道的数据“分散”到多个缓冲区中。

Java NIO带有内置的分散/聚集支持。 分散/聚集是用于阅读和写入频道的概念。

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

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

如果您需要单独处理传输数据的各个部分,Scatter / Gather可能非常有用。 例如,如果一个消息由一个头部和一个主体组成,你可以将头部和主体保存在不同的缓冲区中。 这样做可能会使您更容易分开处理标题和正文。

Scattering Reads 散射读取

“散读”将数据从单个通道读入多个缓冲区。 这是这个原则的例证:

这是一个散点图的例子:
img_fd244d996c8ab8aec6494c064300e2a2.png
image.png

这里是一个代码示例,显示如何执行散射读取:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

ByteBuffer[] bufferArray = { header, body };

channel.read(bufferArray);

注意如何将缓冲区首先插入到数组中,然后将数组作为参数传递给channel.read()方法。 read()方法会按照缓冲区出现在数组中的顺序写入通道中的数据。 一旦缓冲区满了,通道继续填充下一个缓冲区。在转移到下一个之前,散列读取填充一个缓冲区的事实意味着它不适合动态调整大小的消息部分。 换句话说,如果你有一个头部和一个主体,并且头部是固定的大小(例如128字节),那么散射阅读工作正常。

Gathering Writes

“收集写入”将来自多个缓冲区的数据写入单个通道。 这是这个原则的例证:
img_ed5fe83d14250d87c7445e52f177f939.png

这里是一个代码示例,显示如何执行一次聚集写入:

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个字节从该缓冲区写入该信道。 因此,聚集写入与动态大小的消息部分一起工作良好,与散列读取相反。

相关文章
|
6天前
|
Oracle 架构师 Java
Java 22 新增利器: 使用 Java Stream Gather 优雅地处理流中的状态
本文中我们分析了 什么 是 “流”,对比了 Java 上几种常见的 “流”库,引入和详细介绍了 Java 22 中的 Stream Gather API 。同时也简单分享了利用虚拟线程 如何简化 Stream map Concurrent操作符的实现。希望抛砖引玉和大家分享新的特性,共同进步。同时也希望大家都可以升级到新版本的 JDK,更好的赋能业务。
|
6天前
|
存储 Java 数据处理
|
6天前
|
Java API
java中IO与NIO有什么不同
java中IO与NIO有什么不同
|
6天前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
8 2
|
6天前
|
缓存 Java API
Java NIO和IO之间的区别
NIO(New IO),这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
17 1
|
6天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
|
6天前
|
存储 监控 Java
浅谈Java NIO
浅谈Java NIO
7 0
|
6天前
|
消息中间件 存储 Java
【Java NIO】那NIO为什么速度快?
是这样的,在NIO零拷贝出现之前,一个I/O操作会将同一份数据进行多次拷贝。可以看下图,一次I/O操作对数据进行了四次复制,同时来伴随两次内核态和用户态的上下文切换,众所周知上下文切换是很耗费性能的操作。
31 1
【Java NIO】那NIO为什么速度快?
|
6天前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java NIO是一种高效I/O库,特征包括非阻塞性操作、通道(如文件、网络连接)、缓冲区和选择器。选择器监控通道状态变化,通知应用程序数据可读写,避免轮询,提升性能。示例代码展示了一个使用NIO的服务器,监听连接、读取数据并处理客户端通信。
14 1
|
6天前
|
前端开发 Oracle Java
Java 22 新增利器: 使用 Java Stream Gather 优雅地处理流中的状态
Java 22 新增利器: 使用 Java Stream Gather 优雅地处理流中的状态
45 0