Java提供了哪些IO方式❓NIO如何实现多路复用❓

I/O 方式🍑

1)同步阻塞 I/O( BIO )✨

  • 定义与特点:在BIO模型中,当一个线程执行I/O操作如读写数据时,该线程会被阻塞,直到I/O操作完成。这意味着在I/O操作进行期间,该线程不能执行其他任务。
  • 实现:主要通过java.io包实现,如使用FileInputStream和FileOutputStream进行文件操作,或者使用Socket进行网络操作时,都是采用同步阻塞的方式。

2)同步非阻塞I/O(NIO)✨

  • 定义与特点:NIO 允许一个线程从多个通道(Channel)读写数据,通过使用选择器(Selector)实现多路复用。这种方式下,线程可以在等待某个通道准备好进行 I/O 操作时,同时检查其他通道的就绪状态,而不是阻塞在单个 I/O 操作上。
  • 实现:通过 java.nio 包实现,核心概念包括通道(Channel)、缓冲区(Buffer)、选择器(Selector)等。Selector 可以监控多个通道的 I/O 状态(如读、写就绪),实现了同步非阻塞 I/O。
  • 多路复用实现:通过 Selector,一个单独的线程可以管理多个通道,当通道准备好进行 I/O 操作时,Selector 能够检测到并允许线程处理这些事件。应用程序通过注册通道到 Selector 并指定感兴趣的事件(如读、写),Selector 轮询注册的通道,当通道就绪时,线程即可处理这些事件,实现了高效的多路复用。

3)异步非阻塞I/O(AIO/NIO.2)✨

  • 定义与特点:AIO 引入了真正的异步非阻塞 I/O 操作,应用程序可以直接返回,不需要等待 I/O 操作完成。I/O 操作完成后,系统会自动通知应用程序,应用程序再进行相应的处理。
  • 实现:通过java.nio.channels包下的异步通道(如 AsynchronousFileChannel、AsynchronousSocketChannel)实现。AIO 提供了基于事件和回调机制的 I/O 操作,极大提高了程序的性能和响应速度。

NIO如何实现多路复用❓

1)创建一个 Selector 实例🐾

Selector 是一个多路复用器,可以监控多个通道的 I/O 事件(如连接请求、数据到达等)。
Selectorselector= Selector.open();

2)配置非阻塞模式🍑

channel.configureBlocking(false);

3)注册通道到 Selector 🚆

channel.register(selector, SelectionKey.OP_READ);

4)选择就绪的通道🍒

int readyChannels= selector.select();

5)处理就绪的事件🚀

java 复制代码
Set<SelectionKey> selectedKeys = selector.selectedKeys(); 
Iterator<SelectionKey> keyIterator = selectedKeys.iterator(); 
while(keyIterator.hasNext()) { 
	SelectionKeykey= keyIterator.next(); 
	if(key.isAcceptable()) { // 处理接受事件 } 
	elseif (key.isReadable()) { // 处理读事件} 
	keyIterator.remove(); 
}
相关推荐
麦兜*38 分钟前
Spring Boot 企业级动态权限全栈深度解决方案,设计思路,代码分析
java·spring boot·后端·spring·spring cloud·性能优化·springcloud
序属秋秋秋39 分钟前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
ruan1145142 小时前
MySQL4种隔离级别
java·开发语言·mysql
quant_19863 小时前
R语言如何接入实时行情接口
开发语言·经验分享·笔记·python·websocket·金融·r语言
Hellyc6 小时前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
lifallen6 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
hdsoft_huge6 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
百锦再7 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
程序员的世界你不懂7 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(2)对框架加入业务逻辑层
java·selenium·maven
风吹落叶花飘荡7 小时前
2025 Next.js项目提前编译并在服务器
服务器·开发语言·javascript