Java NIO 概览

NIO 与 NIO.2 的核心概念:Buffer/Channel、Path/Files,以及非阻塞与文件 API 的分工。

#type / concept #status / growing #tech / dev #resource / java

[!info] 关联笔记

Java NIO 概览

这个概念为什么出现

经典流 API 在部分高并发网络与精细缓冲区控制上吃力。java.nio 引入 Buffer/Channel/Selector 模型;NIO.2java.nio.file)现代化文件路径与目录操作。多数业务先掌握 Path/Files 与基础 Channel 概念即可。

[!abstract] 一句话理解 NIO 用缓冲区与通道表达 IO;NIO.2 的 Path/Files 是现代文件 API;Selector 非阻塞多路复用属于高并发网络进阶,不应当成读写文件的默认姿势。

最小可运行示例

场景:使用 NIO.2 读取配置并复制到工作目录

import java.nio.charset.StandardCharsets;
import java.nio.file.*;

public class Nio2Config {
    public static void main(String[] args) throws Exception {
        Path dir = Files.createTempDirectory("svc-");
        Path cfg = dir.resolve("app.properties");
        Files.writeString(cfg, "port=8080\n", StandardCharsets.UTF_8);
        Path bak = dir.resolve("app.properties.bak");
        Files.copy(cfg, bak, StandardCopyOption.REPLACE_EXISTING);
        System.out.println(Files.readString(bak, StandardCharsets.UTF_8).trim());
        System.out.println(Files.size(bak));
    }
}

建议运行:

javac Nio2Config.java && java Nio2Config

期望输出示例:

port=8080
10

结合场景再看三个关注点

  1. Path 是路径抽象,跨 OS 分隔符。
  2. Files 工具覆盖读写复制,小文件极方便。
  3. Buffer 翻转等细节在网络/高性能场景再深入。

核心概念与准确模型

1. Buffer

  • 固定容量容器,有 position/limit/capacity
  • flip/clear/compact 状态机

2. Channel

  • 双向或单向数据通道
  • FileChannelSocketChannel

3. Selector

  • 单线程多路复用多个 channel
  • 现代框架常封装,业务少手写

4. NIO.2 文件

  • Path, Paths, Files, FileVisitor
  • 监视服务 WatchService

边界情况与反直觉行为

  1. 直接缓冲区与堆缓冲区分配成本不同。
  2. 非阻塞 read 返回 0 不代表 EOS。
  3. 文件锁、内存映射是高级特性,可移植与语义要查清。

常见误区

[!warning] 常见误区:所有 IO 都该手写 Selector 业务系统优先用成熟 HTTP 服务器/框架;先正确后快。

工程实践

  1. 文件路径全面改 NIO.2。
  2. 大文件流式处理,避免整读。
  3. 性能热点再考虑零拷贝/映射。
  4. 与虚拟线程组合时重新评估阻塞模型(版本相关)。

本节总结

  • NIO=Buffer/Channel 思维
  • NIO.2=现代文件 API
  • 非阻塞网络是进阶专项

自测题

  1. PathFile 老 API 如何选?
  2. Buffer 的 limit 表示什么直觉?
参考答案
  1. 新代码用 Path/Files。
  2. 当前可读/写的边界位置(与 position 配合)。

延伸阅读与资料来源

资料类型支撑内容
NIO.2 File I/O教程Path/Files
java.nio packageAPIBuffer/Channel
创建于 2026/7/15 更新于 2026/7/15