news 2026/3/11 7:36:50

java BIO、NIO、AIO用法样例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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)使用最广泛,平衡了性能和复杂度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/7 9:15:07

超详细逻辑回归解说

逻辑回归是用来做“分类”的模型&#xff08;比如判断“是不是垃圾邮件”“病人有没有患病”“用户会不会点击广告”&#xff09;&#xff0c;而非回归。它的核心是&#xff1a;用“概率”的方式&#xff0c;把线性回归的输出&#xff08;连续值&#xff09;转化为“是/否”的分…

作者头像 李华
网站建设 2026/3/5 22:27:49

基于springboot的美食分享平台网站设计实现

技术背景SpringBoot作为Java生态中广泛使用的框架&#xff0c;简化了传统Spring应用的配置和部署流程。其自动配置、内嵌服务器和依赖管理特性&#xff0c;使得开发者能快速构建高可用的Web应用。在美食分享平台场景中&#xff0c;SpringBoot的高效开发模式适合处理用户生成内容…

作者头像 李华
网站建设 2026/3/9 19:00:20

BMI270,高性能高性价比的运动传感器, 现货库存

BMI270 是一款高性能、低功耗的 6 轴惯性测量单元 (IMU)&#xff0c;集成了高精度三轴加速度计和陀螺仪&#xff0c;并具备智能运动触发中断功能&#xff0c;为各种高性能应用提供了可靠且经济的解决方案。高性能特点 高精度传感器&#xff1a; BMI270 的加速度计和陀螺仪均具有…

作者头像 李华
网站建设 2026/3/5 22:40:36

信息安全的核心支柱:深入解析网络安全技术体系与实践

一、网络安全基础 OSI参考模型与TCP/IP开放模型对比 应用层 应用层 TehnetHTTPSMTPFTP DNSTFTPSSH 表示层 会话层 传输层 传输层 TCPUDP网络层 网络层 IP协议簇&#xff08;RIP、OSPF、SNMP、ICMP&#xff09; 数据链路层 物理和数据链路层 以太网 令牌…

作者头像 李华
网站建设 2026/3/10 9:28:33

在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

作者头像 李华
网站建设 2026/3/10 16:39:28

AI圈炸锅!GraphRAG让大模型不再“一本正经地胡说八道“,小白程序员也能上手的知识图谱增强技术!

前言 传统RAG系统通过检索——生成两阶段法有效缓解了大模型知识陈旧和幻觉问题&#xff0c;但是在处理复杂问题仍存在局限。依赖非结构化的文本向量的检索方式&#xff0c;很难捕捉到实体之间的深层关系&#xff0c;导致上下文不精确、信息碎片化&#xff0c;甚至有发模型幻觉…

作者头像 李华