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

学习日报 20250921|NIO

1. 什么是 NIO?

NIO = New Input/Output,是 Java 在 JDK 1.4 引入的一套新的 I/O API。

和传统的 BIO(Blocking I/O,阻塞IO) 相比,NIO 有三个核心特点:

  1. 非阻塞 I/O

    • 传统 BIO:一个线程读写一个连接,容易造成线程浪费。

    • NIO:一个线程可以管理多个通道(Channel),适合高并发场景。

  2. 基于缓冲区 Buffer

    • BIO:数据直接读到流里。

    • NIO:数据先读到 Buffer,再由程序处理。

  3. 基于 Channel + Selector

    • Channel:类似“通道”,可以同时读写。

    • Selector:选择器,可以监控多个通道(连接)的事件(如读、写、连接等)。


2. NIO 的核心组件

  • Channel(通道):比如 FileChannelSocketChannel

  • Buffer(缓冲区):存储数据,比如 ByteBuffer

  • Selector(选择器):实现多路复用,一个线程监听多个通道。


3. Demo 示例(NIO 服务端与客户端)

📌 服务端:NIO 实现一个简单 Echo Server

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;public class NioServer {public static void main(String[] args) throws IOException {// 1. 打开服务器通道ServerSocketChannel serverChannel = ServerSocketChannel.open();serverChannel.bind(new InetSocketAddress(8080));serverChannel.configureBlocking(false); // 非阻塞// 2. 打开 SelectorSelector selector = Selector.open();serverChannel.register(selector, SelectionKey.OP_ACCEPT);System.out.println("NIO Server started on port 8080...");while (true) {selector.select(); // 阻塞直到有事件发生Iterator<SelectionKey> it = selector.selectedKeys().iterator();while (it.hasNext()) {SelectionKey key = it.next();it.remove();if (key.isAcceptable()) {SocketChannel client = serverChannel.accept();client.configureBlocking(false);client.register(selector, SelectionKey.OP_READ);System.out.println("Client connected: " + client.getRemoteAddress());} else if (key.isReadable()) {SocketChannel client = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(256);int read = client.read(buffer);if (read == -1) {client.close();} else {buffer.flip();client.write(buffer); // 回显数据buffer.clear();}}}}}
}

📌 客户端:NIO 简单连接并发送消息

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;public class NioClient {public static void main(String[] args) throws Exception {SocketChannel client = SocketChannel.open(new InetSocketAddress("localhost", 8080));String message = "Hello NIO!";ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());client.write(buffer);buffer.clear();client.read(buffer);buffer.flip();System.out.println("Server echoed: " + new String(buffer.array(), 0, buffer.limit()));client.close();}
}

4. 运行效果

  1. 启动服务端 → NIO Server started on port 8080...

  2. 启动客户端 → 控制台输出:

    Server echoed: Hello NIO!
    
  3. 服务端控制台会显示客户端连接,并回显消息。


总结一句话
NIO 就是 Java 的新 I/O 模型,基于 Channel + Buffer + Selector,支持 多路复用 + 非阻塞通信,特别适合高并发的网络程序,比如 Netty 框架就是基于 NIO。

http://www.dtcms.com/a/393492.html

相关文章:

  • 【Linux操作系统】Linux基础指令和权限
  • 谷歌nano banana官方Prompt模板
  • 基于Python大数据的新闻推荐分析
  • ​​[硬件电路-315]:AD7606BSTZ如何测量失调电压?
  • 微服务-分布式追踪 / 监控工具大全
  • The Library: 2靶场渗透
  • 金融知识“厦”乡趣 平安产险厦门分公司启动2025年“金融教育宣传周”活动
  • C++学习笔记——模板初阶
  • Windows 下 WSL2 生态:Ubuntu/Docker Desktop 关系、VLLM 部署差异与性能解析
  • 智能体技术革命:从华为金融智能体FAB看AI智能体的未来发展与行业影响
  • CIKM 2025 | FinCast:用于金融时间序列预测的基础模型
  • 论文解读——矩形隧道中MIMO信道特性的模态理论解释
  • Mac brew VSCode Python3
  • 【C++】list 的使用及迭代器底层详解
  • NumPy 系列(三):numpy 数组的索引
  • STL源码探秘(一):深入剖析List的迭代器设计与实现
  • PNP机器人九月具身智能引领FRANKA机器人具身智能技术创新与人形机器人产业全球化新格局,全球具身领先生态推动模型部署和泛化
  • ACP(八):用插件扩展答疑机器人的能力边界
  • 迁移学习:从理论到实践,让模型 “举一反三” 的核心技术
  • ACP(六)自动化评测机器人的表现
  • 【MySQL数据库】MySQL的第一步:从安装启动到用户权限配置的一站式实战指南
  • MySQL笔记7
  • 【C语言】C语言预处理详解,从基础到进阶的全面讲解
  • Spotify:递归嵌入与聚类(四)
  • 三种查询语言比较:SQL、SPL、PromQL
  • [Windows] 迅连科技音频处理工具 CyberLink AudioDirector 2026 16.0.5703.0 中文多语免费版
  • (一)React面试(虚拟DOM/类组件)
  • 亲历 2025 机器人大赛:科技碰撞的震撼与启迪
  • Chromium 138 编译指南 Ubuntu篇:Python环境与开发工具配置(五)
  • 在CentOS上配置SVN至Web目录的自动同步