跳到主要内容

I/O 与 NIO

Java I/O 体系分为传统的 流式 I/O(Stream I/O)和 JDK 1.4 引入的 NIO(New I/O),后者提供块 I/O、非阻塞与多路复用能力。

字节流与字符流

InputStream/OutputStream 是字节流顶层,适合处理二进制数据;Reader/Writer 是字符流顶层,内部使用 Charset 完成字节与字符的转换。几乎所有输入输出 API 都有对应的 Buffered 包装类来减少底层系统调用。

try (BufferedReader br = Files.newBufferedReader(Path.of("a.txt"), StandardCharsets.UTF_8)) {
br.lines().filter(s -> !s.isEmpty()).forEach(System.out::println);
}

NIO 三大组件

Channel 双向通道,代表与文件、套接字的连接;Buffer 是数据的容器,常用 ByteBufferIntBuffer;Selector 基于 epoll/kqueue 实现非阻塞多路复用,单线程可管理多个通道,是 Netty 等框架的基础。

NIO.2(JDK 7+)进一步增强文件 API,java.nio.file.FilesPaths 提供 readAllByteswritecopymovedeleteIfExists 等方法,以及 DirectoryStream 流式遍历目录,极大简化了文件操作。

传统 I/O 与 NIO 对比

传统 I/O 面向流,一次一字节,阻塞线程;NIO 面向缓冲区,可一次读写大块数据,并通过 Selector 实现非阻塞。NIO 适合高并发网络服务,传统 I/O 在简单顺序读写时更直观。