NIO 与传统 IO 的主要区别和关系:

1. NIO 是一个全新的 IO 模型

  • NIO 引入了通道(Channel)缓冲区(Buffer) 概念,这是与传统流(Stream)模型完全不同的 IO 方式
  • 传统 IO 是面向流的,数据只能顺序读写
  • NIO 是面向缓冲区的,可以随机访问数据

2. 对文件和路径的重写

  • 新增了 PathPathsFiles 等类,替代了传统的 File
  • 这些新类提供了更丰富、更高效的文件操作方法
  • 例如:Files.readAllLines()Files.copy() 等简化了很多常见操作

3. 字符处理方面的变化

  • NIO 提供了 CharsetCharsetDecoder/Encoder 类,让字符编码转换更灵活
  • 提供了 StandardCharsets 类统一管理标准字符集
  • 这些功能确实让字符处理更强大,但这只是 NIO 的一部分

4. 其他重要特性

  • 非阻塞 IO:NIO 的核心优势之一,特别适合网络编程
  • 选择器(Selector):可以用一个线程管理多个通道,大大提高并发处理能力
  • 内存映射文件:通过 MappedByteBuffer 直接将文件映射到内存
  • 管道(Pipe):线程间通信的新方式

5. NIO 与传统 IO 的关系

  • NIO 并不是完全取代传统 IO,而是提供了一种新的、更强大的选择
  • 很多传统 IO 类仍然广泛使用,尤其是字符流相关类
  • NIO.2 (JDK 7+) 引入的文件 API 确实让文件操作更简单

Java IO 流核心类对比表(含常用度与替代说明)

类别 具体类名 流类型 核心作用 常用度 替代说明(含 NIO.2 关联)
字节节点流 FileInputStream 字节输入 从文件读取字节数据(如读图片、音频) ★★★★★ 无完全替代,NIO.2 的 Files.readAllBytes() 可简化文件读字节操作,但底层仍依赖类似逻辑
FileOutputStream 字节输出 向文件写入字节数据(如写图片、音频) ★★★★★ 无完全替代,NIO.2 的 Files.write() 可简化文件写字节操作,日常场景中两者均常用
ByteArrayInputStream 字节输入 从内存字节数组(byte[])读取数据 ★★★★☆ 无替代,内存操作场景高频使用,NIO 未专门覆盖此类基础内存流功能
ByteArrayOutputStream 字节输出 向内存字节数组(byte[])写入数据(可动态扩容) ★★★★☆ 无替代,内存数据拼接场景(如临时缓存)常用,NIO 无直接对应类
字节包装流 BufferedInputStream 字节输入 给字节节点流加缓冲,提升读取效率(减少 IO 次数) ★★★★★ 无替代,几乎所有字节输入场景都会搭配使用,NIO 缓冲机制不同但不直接替代此类
BufferedOutputStream 字节输出 给字节节点流加缓冲,提升写入效率(需注意 flush()) ★★★★★ 无替代,字节输出场景高频搭配,NIO 不直接替代
DataInputStream 字节输入 读取基本数据类型(int、double 等)的字节流(需与 DataOutputStream 配合) ★★★☆☆ 无替代,二进制序列化基础类型场景常用,NIO 无直接对应类,需手动处理
DataOutputStream 字节输出 写入基本数据类型(int、double 等)的字节流 ★★★☆☆ 无替代,与 DataInputStream 配套使用,日常二进制数据传输场景偶用
PrintStream 字节输出 格式化输出字节流(如 System.out 本质是 PrintStream),支持自动 flush ★★★★★ 无替代,控制台输出、日志简单写入场景高频,NIO 不直接替代,仍是日常 IO 核心类
字符节点流 FileReader 字符输入 从文件读取字符数据(默认用系统编码,如 UTF-8) ★★★★☆ 可被 NIO.2 的 Files.newBufferedReader() 替代(后者更灵活指定编码),但传统场景仍常用
FileWriter 字符输出 向文件写入字符数据(默认用系统编码) ★★★★☆ 可被 NIO.2 的 Files.newBufferedWriter() 替代(支持指定编码),传统场景仍有使用
CharArrayReader 字符输入 从内存字符数组(char[])读取数据 ★★★☆☆ 无替代,内存字符数据读取场景偶用,NIO 无直接对应类
CharArrayWriter 字符输出 向内存字符数组(char[])写入数据(可动态扩容) ★★★☆☆ 无替代,内存字符拼接场景(如字符串构建)偶用,NIO 无直接对应类
字符包装流 BufferedReader 字符输入 给字符节点流加缓冲,支持 readLine() 读取整行 ★★★★★ 无替代,所有字符输入场景(如读文本文件、控制台)必用,NIO.2 的缓冲流本质是其优化版
BufferedWriter 字符输出 给字符节点流加缓冲,支持 newLine() 跨平台换行 ★★★★★ 无替代,字符输出场景必用,NIO.2 的缓冲流是其优化版,但核心逻辑一致
InputStreamReader 字符输入 字节流→字符流的转换(需指定编码,解决中文乱码) ★★★★★ 无替代,字节流转字符流的核心类(如 System.in 转字符读),NIO 编码转换机制不同但不替代此类
OutputStreamWriter 字符输出 字符流→字节流的转换(需指定编码) ★★★★★ 无替代,字符流转字节流的核心类,日常 IO 中字符→字节转换必用,NIO 不直接替代
PrintWriter 字符输出 格式化输出字符流(支持指定编码),需手动 flush() ★★★★★ 无替代,文本格式化输出(如日志、文件)高频,功能比 PrintStream 更灵活,NIO 不直接替代
NIO.2 核心类 Files 工具类 提供静态方法简化文件操作(读/写字节、字符,复制/删除文件等) ★★★★★ 无替代,JDK 7+ 后日常文件操作首选,底层封装传统 IO,但简化了代码(如无需手动关流)
Paths 工具类 创建 Path 对象(表示文件/目录路径) ★★★★★ 无替代,NIO.2 中路径操作的核心工具,与 Files 配合使用
Path 路径类 表示文件/目录的路径(替代传统 File 类的部分功能) ★★★★★ 无替代,NIO.2 路径操作的核心类,比传统 File 类更高效、功能更全
BufferedWriter(NIO) 字符输出 Files.newBufferedWriter() 创建,本质是传统 BufferedWriter 优化版 ★★★★★ 替代传统 FileWriter+BufferedWriter 组合,支持指定编码,无需手动关流(try-with-resources)
BufferedReader(NIO) 字符输入 Files.newBufferedReader() 创建,本质是传统 BufferedReader 优化版 ★★★★★ 替代传统 FileReader+BufferedReader 组合,支持指定编码,简化代码
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐