JAVA基础之NIO

什么是NIO?

一般认为是同步非阻塞IO或者多路复用IO,他是一种基于通道channel通道和buffer缓冲区的方式。数据总是从通道Channel通道读取到Buffer缓冲区或者从缓冲区写入通道,而selector选择区可以监听多个通道的事件,所以可以使用单线程监听多个数据通道。

主要有以下三个核心概念:

  • 通道(Channel):通道可以看作是一个连接源和目标的通道,数据可以通过通道从一个地方传输到另一个地方。通道类似于传统的流(Stream),但与流不同的是,通道是双向的,可以用于读、写或同时进行读写操作。比如硬件设备、文件、网络套接字或可以执行一个或多个IO操作的程序组件的开放链接。Channel常见的实现接口有FileChannel对应文件IO,DategramChannel对应UDP,SocketChannel和ServerSocketChannel对应TCP的客户端和服务器端,Channel和IO中的Stream差不多一个等级,只不过Stream是单向的比如InputStream、OutputStream。
  • 缓冲区(Buffer):缓冲区是一个用于储存特定基本类型的数据容器,所有数据都是通过缓冲区进行处理的。缓冲区本质上是一个数组,但它提供了对数据的结构化访问以及维护读写位置的功能。除了Boolean以外,其余每一种基本类型都有一个对应的Buffer类,Buffer的子类有ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer 。
  • 选择器(Selector):选择器是NIO中的一个重要组件,它可以用于监听多个通道的事件(如连接请求、数据到达等)。通过选择器,程序可以在一个线程中处理多个通道,从而大大提高了I/O处理的效率。

基础流程

简单说一下NIO的流程,就是我们客户端建立一个链接Channel 之后,肯定不是时时刻刻都进行信息交互对吧。所以就没有必要死耗着一个线程不放手,占用资源。

那么NIO最优秀的一个核心思想就是,通过Selector 线程选择器监听所有的链接,只要发现有事件了,就接收通知,然后启动一个线程进行处理。

在处理的过程中,肯定还是要线程拿取数据来进行处理,那么处理过程中,数据如何中转呢,这就是Buffer 缓冲区的使用。

通过一个线程,监听所有的通道,不会有线程阻塞在这里,这就是非阻塞

优点

  • 高效处理并发连接:NIO通过非阻塞I/O和选择器机制能够在单线程中处理大量并发连接,适合高并发场景。
  • I/O多路复用:NIO允许多个通道共用一个线程进行管理,减少了线程的资源消耗。
  • 灵活性:NIO的通道、缓冲区、选择器提供了比传统I/O更为灵活的数据处理方式。

缺点

  • 编程复杂度高:与BIO相比,NIO的编程模型更复杂,开发者需要管理选择器、通道、缓冲区等多个组件,这增加了代码的复杂性。
  • 适用场景有限:NIO的优势在于高并发场景,但对于低并发、长连接的场景,BIO可能会更简单高效。
相关推荐
奔跑的蜗牛ing5 小时前
CentOS Nginx 安装与静态文件服务器配置指南
前端·面试·架构
KaifuZeng8 小时前
通信与接口协议面试五、RS422
嵌入式硬件·面试·通信与接口
SamDeepThinking10 小时前
组合还是继承?我在项目里主要看这两个判断
java·后端·面试
wear工程师10 小时前
setState 到底是不是异步的?这题从 React 16 问到 18,标准答案早就变了
react.js·面试
SamDeepThinking13 小时前
为什么很多人学了Java,还是没真正理解类和对象?
java·后端·面试
阿新聊ai13 小时前
Claude Code 为什么总不懂你的项目?缺一张「项目地图」
前端·后端·面试
用户8524950718414 小时前
Promise 全解析:从三状态到 Promise.all
面试
嘟嘟071714 小时前
Node.js spawn 实现迷你 Cursor 自动化终端|子进程完整解析
前端·后端·面试
weedsfly14 小时前
纯函数与副作用——前端开发中最容易被忽视的质量保证
前端·javascript·面试
whaledown15 小时前
互联网大厂Java求职面试三轮提问详解(涵盖Spring Boot、微服务、Kafka等核心技术)
java·jvm·数据库·spring boot·微服务·面试·kafka