IO

IO的核心就是数据传输,也就是程序与外部设备之间进行传输,通过IO的核心可以分为,

文件IO和网络IO

文件IO交互的对象就是本地存储设备,比方说读写本地文件。

网络IO交互的对象就是网络设备,核心的应用场景就是网络通信。

按照操作方式来进行划分:同步IO和异步IO

同步IO核心逻辑是指调用者发起IO请求之后必须等待IO操作完全完成,才能继续执行,缺点就是效率低,应用场景大部分简单业务。

异步IO调用者发起IO请求后,无需等待,直接返回,IO完成后内核通知告知调用者和。缺点就是逻辑复杂,需要进行通知处理,应用在高并发场景。

按照内核是否拷贝数据分:阻塞IO和非阻塞IO。

阻塞IO核心逻辑是发起请求之后内核若数据未准备好,会让调用者阻塞,直到数据准备好并完成拷贝,才会叫醒调用者。

非阻塞IO:核心逻辑是调用者发起请求后,内核数据未准备好,会立即返回未就绪状态,调用者需要通过轮询进行反复的查找,确认数据是否准备好

经典IO模型

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

  • 为什么叫“BIO”?
    因为它代表 Blocking I/O。在 Java 1.4 之前,只有一套原始的 I/O API(java.io 包,如 InputStreamOutputStreamServerSocketSocket)。这套 API 的核心特征就是 阻塞

  • “阻塞”体现在哪里?
    当线程调用 read() 或 accept() 等方法时,线程会被挂起,直到数据准备好或连接建立成功。在此期间,这个线程什么也干不了,就像被“阻塞”住了一样。

  • 设计模式
    通常采用 “一个连接一个线程” 的模型。当并发连接数很高时,需要创建大量线程,而线程上下文切换的开销巨大,会耗尽系统资源。

结论:BIO 是以其最核心的特征——Blocking(阻塞)——来命名的。


2. NIO - New I/O / Non-blocking I/O (新的 I/O / 非阻塞 I/O)

  • 为什么叫“NIO”?
    这个名字有双重含义

    1. 字面意思:New I/O。因为在 Java 1.4 中,它是一套全新的 I/O API(java.nio 包),旨在解决 BIO 的性能瓶颈。

    2. 核心特性:Non-blocking I/O。这是这套新 API 最引人注目的特性之一。它提供了非阻塞的工作模式。

  • “非阻塞”体现在哪里?
    线程可以向通道(Channel)发起一个读请求,如果当时没有数据可用,线程不会被挂起,而是立刻得到一个返回结果(比如返回 0),然后这个线程可以马上去处理其他通道的请求。

  • 核心机制
    它的非阻塞能力是建立在 I/O 多路复用 机制之上的(通过 Selector 实现)。一个线程可以轮询多个通道(Channel),看哪些已经就绪,然后只对那些就绪的通道进行实际的 I/O 操作。这才是它能够用少量线程处理大量连接的关键。

结论:NIO 的名字既代表了它是“新”的 API,也强调了其“非阻塞”的核心特性。


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

  • 为什么叫“AIO”?
    因为它代表 Asynchronous I/O。这是在 Java 7 中引入的,更加强大和彻底的异步 I/O 模型。

  • “异步”体现在哪里?
    它与“非阻塞”有本质区别:

    • NIO (Non-blocking): 是 同步的。你需要不断地主动去问(轮询)数据好了没有,然后自己去拷贝数据。

    • AIO (Asynchronous): 是 真正异步的。你只需要发起一个 I/O 操作(如 read),并提供一个回调函数。当内核完成所有工作(包括数据准备和从内核空间拷贝到用户空间)后,会主动通知你,并调用你提供的回调函数。

    整个过程,应用程序线程完全不需要参与,可以继续执行其他逻辑。

  • 实现
    在 Java 中,AIO 的相关类在 java.nio.channels 包下,主要以 AsynchronousSocketChannelAsynchronousServerSocketChannel 和 CompletionHandler 为核心。

结论:AIO 的名字准确地描述了其“异步”的本质特征,即“你叫我,我来做,做好了回调告诉你”。

缩写 全称 中文 核心特征 模型 比喻
BIO Blocking I/O 阻塞式 I/O 调用会阻塞线程 同步阻塞 同步排队:在餐厅点餐后,必须站在柜台前傻等,直到餐做好。
NIO New I/O Non-blocking I/O 新的 I/O 非阻塞 I/O 调用不会阻塞线程 同步非阻塞 (I/O多路复用) 异步排队:点餐后拿个号,你可以去玩手机,但需要不时抬头看屏幕是否叫到你的号,然后自己去取
AIO Asynchronous I/O 异步 I/O 由系统完成后回调 异步非阻塞 外卖手机下单后就不用管了,外卖小哥会直接送到你手上,并通知你。

“BIO 和 NIO 的命名主要源于 Java API 的演进。BIO 代表 Blocking I/O,强调了其阻塞的特性。NIO 既是 New I/O(一套新的 API),也代表了 Non-blocking I/O(其核心特性之一)。而 AIO 则明确代表了 Asynchronous I/O,即异步 I/O 模型,这是从它们最根本的行为特征来命名的。”

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐