Wrayの知识库 Wrayの知识库
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • 计算机基础
  • 操作系统原理
  • Linux
  • MacOS
  • Windows
  • 系统工程与研究专题
  • AI 基础
  • 大模型基础
  • Prompt 工程
  • RAG 检索增强生成
  • Agent 智能体
  • AI 应用开发
  • AI 工程化
  • AI 安全与治理
  • AI 面试与设计题
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • 计算机基础
  • 操作系统原理
  • Linux
  • MacOS
  • Windows
  • 系统工程与研究专题
  • AI 基础
  • 大模型基础
  • Prompt 工程
  • RAG 检索增强生成
  • Agent 智能体
  • AI 应用开发
  • AI 工程化
  • AI 安全与治理
  • AI 面试与设计题
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
  • Java章节编写规范
  • Java基础

  • Java集合

  • Java并发

  • Java IO

    • Java IO概述
    • IO基础

    • 常用IO流

    • 文件与目录操作

    • Java NIO

    • 高级主题

    • 实践与性能优化

    • 面试与设计题

      • Java IO核心面试题
      • Java NIO核心面试题
        • 1. NIO 的核心组件是什么
        • 2. Buffer 的 position、limit、capacity 是什么
        • 3. flip 的作用是什么
        • 4. Channel 和 Stream 有什么区别
        • 5. Selector 的作用是什么
        • 6. OP_WRITE 为什么不能一直注册
        • 7. 什么是零拷贝
        • 8. BIO、NIO、AIO 区别
        • 9. NIO 是否一定比 BIO 快
        • 专家答题框架
        • Tips 快问快答
        • 10. 总结
      • IO场景设计题
    • IO实践速查

  • JVM

目录

Java NIO核心面试题

NIO 面试通常会围绕 Buffer、Channel、Selector、零拷贝、BIO/NIO/AIO 对比展开。回答时要体现底层模型和工程取舍。

# 1. NIO 的核心组件是什么

NIO 核心组件是:

  • Buffer:数据缓冲区。
  • Channel:数据通道。
  • Selector:多路复用选择器。

数据通过 Channel 读入 Buffer,程序从 Buffer 取数据;网络 Channel 可以注册到 Selector,由一个线程监听多个连接事件。

# 2. Buffer 的 position、limit、capacity 是什么

  • capacity:缓冲区容量。
  • position:下一次读或写的位置。
  • limit:当前读写边界。

写入数据后要调用 flip() 切换为读模式。读完后调用 clear() 或 compact() 准备下一轮写入。

# 3. flip 的作用是什么

flip() 用于从写模式切换到读模式:

  • limit = position
  • position = 0

如果写完数据后忘记 flip(),程序可能读不到刚写入的数据。

# 4. Channel 和 Stream 有什么区别

Stream 面向流,通常单向;Channel 面向缓冲区,通常可以双向读写。

NIO 的 Channel 可以和 Buffer、Selector 配合,实现更灵活的文件和网络 IO。

# 5. Selector 的作用是什么

Selector 允许一个线程监听多个 Channel 的就绪事件,如接收连接、可读、可写。它解决了大量连接下一个连接一个线程的资源浪费问题。

Selector 是 Reactor 模式的重要基础。

# 6. OP_WRITE 为什么不能一直注册

大多数 TCP 连接多数时间都是可写的。如果一直关注 OP_WRITE,Selector 会不断返回写事件,导致 CPU 空转。

正确做法是:只有待写数据没写完时注册 OP_WRITE,写完后取消关注。

# 7. 什么是零拷贝

零拷贝是减少数据在内核态和用户态之间复制的技术。Java 中常见方式是 FileChannel.transferTo 和 transferFrom。

它适合大文件传输、静态文件服务、消息队列文件发送等数据搬运场景。

# 8. BIO、NIO、AIO 区别

  • BIO:同步阻塞,一个连接通常对应一个线程。
  • NIO:同步非阻塞,通过 Selector 多路复用。
  • AIO:异步 IO,操作完成后通过回调或 Future 通知。

Java 服务端高性能网络框架通常更多使用 NIO 模型。

# 9. NIO 是否一定比 BIO 快

不一定。NIO 的优势主要在大量连接和高并发网络场景。简单文件读写或连接数很少的系统中,BIO 更简单,性能也可能足够。

选择 NIO 要考虑复杂度和维护成本。

# 专家答题框架

题型 回答主线 加分点
Buffer position/limit/capacity flip/clear/compact 状态机
Channel 与 Buffer 配合读写 FileChannel、SocketChannel
Selector 多路复用事件模型 Reactor、OP_WRITE
网络问题 粘包、半包、半写 协议边界和状态机
性能问题 少线程管理多连接 Netty 和零拷贝

NIO 回答路径:

Buffer 存数据
  ▼
Channel 搬数据
  ▼
Selector 等事件
  ▼
Reactor 分发事件
  ▼
业务线程处理耗时逻辑

# Tips 快问快答

Q:NIO 核心三件套是什么? A:Buffer、Channel、Selector。

Q:Buffer 为什么要 flip? A:从写模式切换到读模式,设置读取边界。

Q:Channel 和 Stream 的区别是什么? A:Channel 配合 Buffer,通常更适合双向和非阻塞模型。

Q:Selector 的作用是什么? A:监听多个 Channel 的就绪事件。

Q:OP_WRITE 为什么不能长期注册? A:Socket 多数时间可写,会导致选择器频繁唤醒。

Q:NIO 如何解决高并发连接? A:用少量线程通过 Selector 管理大量连接事件。

Q:NIO 需要处理哪些网络边界? A:粘包、拆包、半包读、半包写、异常关闭和背压。

Q:为什么生产更常用 Netty? A:Netty 封装了 NIO 复杂细节,提供成熟线程模型和编解码体系。

# 10. 总结

NIO 面试最重要的是讲清楚模型:Buffer 管数据,Channel 管通道,Selector 管多路事件。更深入的回答要能说明粘包拆包、半包写出、OP_WRITE、零拷贝和 Reactor 模式。

上次更新: 2026/06/25, 14:19:18
Java IO核心面试题
IO场景设计题

← Java IO核心面试题 IO场景设计题→

Copyright © 2023-2026 Wray | 鄂ICP备2024050235号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式