Java 中 NIO与传统IO的关系 (附Java IO 流核心类对比表)
文章目录
- 1. NIO 是一个全新的 IO 模型
- 2. 对文件和路径的重写
- 3. 字符处理方面的变化
- 4. 其他重要特性
- 5. NIO 与传统 IO 的关系
- Java IO 流核心类对比表(含常用度与替代说明)
NIO 与传统 IO 的主要区别和关系:
1. NIO 是一个全新的 IO 模型
- NIO 引入了通道(Channel) 和 缓冲区(Buffer) 概念,这是与传统流(Stream)模型完全不同的 IO 方式
- 传统 IO 是面向流的,数据只能顺序读写
- NIO 是面向缓冲区的,可以随机访问数据
2. 对文件和路径的重写
- 新增了
Path
、Paths
、Files
等类,替代了传统的File
类 - 这些新类提供了更丰富、更高效的文件操作方法
- 例如:
Files.readAllLines()
、Files.copy()
等简化了很多常见操作
3. 字符处理方面的变化
- NIO 提供了
Charset
和CharsetDecoder
/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 组合,支持指定编码,简化代码 |