当前位置: 首页 > news >正文

java BIO、NIO、AIO用法样例

1. BIO (Blocking I/O) - 同步阻塞 I/O

BIO 是传统的网络编程模型,每个连接对应一个线程,当线程执行读/写操作时会被阻塞,直到数据就绪。

示例:BIO 服务器

importjava.net.*;importjava.io.*;publicclassBioServer{publicstaticvoidmain(String[]args)throwsIOException{ServerSocketserverSocket=newServerSocket(8080);System.out.println("BIO Server started on port 8080");while(true){SocketclientSocket=serverSocket.accept();// 阻塞等待客户端连接newThread(()->{try{BufferedReaderin=newBufferedReader(newInputStreamReader(clientSocket.getInputStream()));PrintWriterout=newPrintWriter(clientSocket.getOutputStream(),true);Stringrequest;while((request=in.readLine())!=null){// 阻塞读取数据System.out.println("Received: "+request);out.println("Echo: "+request);// 响应客户端}clientSocket.close();}catch(IOExceptione){e.printStackTrace();}}).start();}}}

特点

  • 每个连接一个线程,适合连接数少的场景。
  • 编程简单,但线程开销大,无法应对高并发。

2. NIO (Non-blocking I/O) - 同步非阻塞 I/O

NIO 基于 Channel 和 Selector,使用单个线程管理多个连接,通过事件驱动机制实现非阻塞。

示例:NIO 服务器

importjava.net.*;importjava.nio.*;importjava.nio.channels.*;importjava.util.*;publicclassNioServer{publicstaticvoidmain(String[]args)throwsIOException{ServerSocketChannelserverChannel=ServerSocketChannel.open();serverChannel.bind(newInetSocketAddress(8080));serverChannel.configureBlocking(false);// 非阻塞模式Selectorselector=Selector.open();serverChannel.register(selector,SelectionKey.OP_ACCEPT);// 注册接受连接事件System.out.println("NIO Server started on port 8080");while(true){selector.select();// 阻塞直到有事件发生Set<SelectionKey>keys=selector.selectedKeys();Iterator<SelectionKey>iter=keys.iterator();while(iter.hasNext()){SelectionKeykey=iter.next();iter.remove();if(key.isAcceptable()){ServerSocketChannelserver=(ServerSocketChannel)key.channel();SocketChannelclient=server.accept();client.configureBlocking(false);client.register(selector,SelectionKey.OP_READ);// 注册读事件System.out.println("Client connected: "+client.getRemoteAddress());}elseif(key.isReadable()){SocketChannelclient=(SocketChannel)key.channel();ByteBufferbuffer=ByteBuffer.allocate(1024);intread=client.read(buffer);// 非阻塞读取if(read>0){buffer.flip();byte[]data=newbyte[buffer.remaining()];buffer.get(data);Stringrequest=newString(data);System.out.println("Received: "+request);// 响应客户端ByteBufferresponse=ByteBuffer.wrap(("Echo: "+request).getBytes());client.write(response);}elseif(read==-1){client.close();}}}}}}

特点

  • 单线程处理多连接,减少线程开销。
  • 复杂度较高,需要处理事件循环和缓冲区。

3. AIO (Asynchronous I/O) - 异步非阻塞 I/O

AIO 基于回调机制,应用程序发起 I/O 操作后立即返回,当操作完成时系统会通知应用程序。

示例:AIO 服务器

importjava.net.*;importjava.nio.*;importjava.nio.channels.*;importjava.util.concurrent.*;publicclassAioServer{publicstaticvoidmain(String[]args)throwsIOException{AsynchronousServerSocketChannelserver=AsynchronousServerSocketChannel.open();server.bind(newInetSocketAddress(8080));System.out.println("AIO Server started on port 8080");// 接受连接的回调server.accept(null,newCompletionHandler<AsynchronousSocketChannel,Void>(){@Overridepublicvoidcompleted(AsynchronousSocketChannelclient,Voidattachment){server.accept(null,this);// 继续接受下一个连接ByteBufferbuffer=ByteBuffer.allocate(1024);// 读取数据的回调client.read(buffer,buffer,newCompletionHandler<Integer,ByteBuffer>(){@Overridepublicvoidcompleted(IntegerbytesRead,ByteBufferbuffer){if(bytesRead>0){buffer.flip();byte[]data=newbyte[buffer.remaining()];buffer.get(data);Stringrequest=newString(data);System.out.println("Received: "+request);// 响应客户端ByteBufferresponse=ByteBuffer.wrap(("Echo: "+request).getBytes());client.write(response,null,newCompletionHandler<Integer,Void>(){@Overridepublicvoidcompleted(Integerresult,Voidattachment){try{client.close();}catch(IOExceptione){e.printStackTrace();}}@Overridepublicvoidfailed(Throwableexc,Voidattachment){exc.printStackTrace();}});}}@Overridepublicvoidfailed(Throwableexc,ByteBufferattachment){exc.printStackTrace();}});}@Overridepublicvoidfailed(Throwableexc,Voidattachment){exc.printStackTrace();}});// 保持服务器运行Thread.currentThread().join();}}

特点

  • 完全异步,基于回调或 Future,性能高。
  • 编程模型复杂,适合连接数多且长连接的场景。

对比分析

特性BIONIOAIO
模型同步阻塞同步非阻塞(多路复用)异步非阻塞
线程数一个连接一个线程一个线程处理多个连接少量线程,回调驱动
吞吐量低(线程上下文切换开销大)中高
编程复杂度简单复杂(需处理 Selector 等)非常复杂(回调地狱)
适用场景连接数少、固定架构连接数多、短连接(如聊天)连接数多、长连接(如文件传输)
JDK 版本Java 1.0+Java 1.4+Java 1.7+

总结

  • BIO:简单但性能差,适合低并发场景。
  • NIO:性能较好,复杂度高,适合高并发短连接(Netty 基于 NIO)。
  • AIO:性能最佳,但编程复杂,在 Linux 上优势不明显(Linux 对 AIO 支持有限,常用 NIO)。

实际项目中,NIO 框架(如 Netty)使用最广泛,平衡了性能和复杂度。

http://www.jsqmd.com/news/206153/

相关文章:

  • 运放内部分立器件仿真,仿真对应的参数 LM741
  • java垃圾收集 minorgc majargc fullgc
  • java垃圾收集 minorgc majargc fullgc
  • 基于RK3399Pro与RK3568的车载防撞方案:为货车泥头车安全护航
  • 超详细逻辑回归解说
  • 超声波传感器(HC-SR04)与Arduino Uno及Mixly使用
  • UVM-phase中的object机制
  • 学霸同款2026TOP10AI论文网站:本科生毕业论文神器测评
  • react组件内添加一个全局点击时间,点击函数能区分是否是某个特定的id的dom触发的
  • 风光柴储多目标联合调度问题探索
  • 实体门店新纪元:从“单点AI尝试”到“系统智能体”的转型之路
  • Oracle 高风险锁等待快速诊断手册
  • 从“经验驱动”到“系统智能”:实体门店经营的结构性升级
  • 数据库笔记
  • AI+IoT双轮驱动:构建风电设备预测性维护数字孪生体的全栈技术实践
  • UE5 C++(7):
  • 亲测好用8个AI论文写作软件,本科生搞定论文不求人!
  • 企业落地 ChatBI,如何构建可信可靠的数据底座?
  • UE5 C++(6-2):描述角色 EndPlay 原因的枚举类 EEndPlayReason::Type,此命名空间里定义了一个枚举类。
  • 基于IEEE33节点配电网的分布式电源与电动汽车接入潮流计算研究:考虑风光时序特性与电动汽车出...
  • 【珍藏干货】零成本打造智能文档问答系统!Everything plus RAG实战:让AI帮你从海量文档中精准找答案
  • 基于springboot的美食分享平台网站设计实现
  • 脉脉独家【AI创作者xAMA】| 多维价值与深远影响
  • 网络安全核心技术要点速查手册:面试与工作实战必备总结
  • AI 写论文哪个软件最好?虎贲等考 AI 凭 “学术闭环” 登顶首选
  • CSDN技术变现指南:从0到1开启知识创富之路
  • 初学者通关指南:聚焦信息安全中的网络安全,一文厘清关键技术与概念
  • 虎贲等考 AI:重新定义学术写作,全流程智能赋能科研新生态
  • 网络安全其实很简单!零基础就能读懂的五大关键技术,颠覆你的认知
  • BMI270,高性能高性价比的运动传感器, 现货库存