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.2(java.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
结合场景再看三个关注点
Path是路径抽象,跨 OS 分隔符。Files工具覆盖读写复制,小文件极方便。- Buffer 翻转等细节在网络/高性能场景再深入。
核心概念与准确模型
1. Buffer
- 固定容量容器,有 position/limit/capacity
flip/clear/compact状态机
2. Channel
- 双向或单向数据通道
FileChannel、SocketChannel等
3. Selector
- 单线程多路复用多个 channel
- 现代框架常封装,业务少手写
4. NIO.2 文件
Path,Paths,Files,FileVisitor- 监视服务
WatchService
边界情况与反直觉行为
- 直接缓冲区与堆缓冲区分配成本不同。
- 非阻塞 read 返回 0 不代表 EOS。
- 文件锁、内存映射是高级特性,可移植与语义要查清。
常见误区
[!warning] 常见误区:所有 IO 都该手写 Selector 业务系统优先用成熟 HTTP 服务器/框架;先正确后快。
工程实践
- 文件路径全面改 NIO.2。
- 大文件流式处理,避免整读。
- 性能热点再考虑零拷贝/映射。
- 与虚拟线程组合时重新评估阻塞模型(版本相关)。
本节总结
- NIO=Buffer/Channel 思维
- NIO.2=现代文件 API
- 非阻塞网络是进阶专项
自测题
Path与File老 API 如何选?- Buffer 的 limit 表示什么直觉?
参考答案
- 新代码用 Path/Files。
- 当前可读/写的边界位置(与 position 配合)。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| NIO.2 File I/O | 教程 | Path/Files |
| java.nio package | API | Buffer/Channel |