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可能会更简单高效。
相关推荐
nice_lcj5208 小时前
LRU 缓存入门:它是什么、怎么用、面试怎么手写
java·数据结构·缓存·面试·lru
聪明的笨猪猪1 天前
企业知识库AI架构选型:落地导向的架构决策与组件清单
经验分享·面试·架构·embedding·数据库架构
stormzhangV2 天前
涨薪 50% 怎么做到的?
人工智能·面试·aigc
聪明的笨猪猪2 天前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
李剑一2 天前
别再抬杠,前端岗已经没了!无论前后端,我们最终都要成“全干”工程师
前端·面试
Yuzhiyuxia2 天前
【AI Agent面试系列】AI Agent可观测、评测、安全相关的知识点
人工智能·安全·面试
时间的拾荒人2 天前
Redis 集合类型详解:Set 与 Zset
redis·缓存·面试
wo_jack2 天前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
Rain的Java大神之路2 天前
设计一套生产级 API 接口:从契约、安全、幂等到限流,我踩过的坑都在这了
java·后端·面试