Java IO概述
Java IO 是 Java 语言中处理输入和输出的基础能力。只要程序需要和外部世界交换数据,就离不开 IO:读取配置文件、写入日志、上传下载文件、网络通信、对象持久化、进程间通信、消息中间件刷盘、数据库读写,本质上都可以看到 IO 的影子。
从学习路径上看,Java IO 可以分为三个层次:
- 基础阶段:理解输入、输出、字节、字符、流、缓冲、文件这些概念,能够正确读写文本和二进制文件。
- 进阶阶段:理解装饰器模式、序列化、字符集、资源关闭、异常处理,能够写出稳定可靠的 IO 代码。
- 高级阶段:理解 NIO、Buffer、Channel、Selector、零拷贝、内存映射、BIO/NIO/AIO 模型,能够分析高性能网络和文件系统场景。
# 1. Java IO 解决什么问题
Java 程序运行在 JVM 中,而数据往往存在于 JVM 外部:
- 文件在磁盘上。
- 请求在网络连接中。
- 图片、音频、视频是二进制数据。
- 文本数据需要按照某种字符集编码和解码。
- 对象需要转换成字节后才能保存或传输。
Java IO 的核心任务就是在程序和外部资源之间建立数据通道。
外部数据源 -> 输入流 -> Java 程序 -> 输出流 -> 外部目标
例如:
- 从文件读取内容:文件是数据源,程序使用输入流读取。
- 向文件写入日志:程序产生数据,使用输出流写入文件。
- 从 Socket 接收请求:网络连接是数据源,程序读取字节。
- 向浏览器返回响应:程序把数据写入网络输出流。
# 2. Java IO 的核心分类
Java IO 体系可以先从两个维度理解。
# 2.1 按数据方向划分
- 输入流:从外部读取数据到程序中,如
InputStream、Reader。 - 输出流:从程序写出数据到外部,如
OutputStream、Writer。
# 2.2 按数据单位划分
- 字节流:以字节为单位处理数据,适合图片、视频、压缩包、网络协议等二进制场景。
- 字符流:以字符为单位处理数据,适合文本场景,本质上会涉及字符集编码和解码。
因此 Java IO 最核心的四个抽象类是:
| 抽象类 | 方向 | 单位 | 典型场景 |
|---|---|---|---|
InputStream | 输入 | 字节 | 读取图片、压缩包、网络字节 |
OutputStream | 输出 | 字节 | 写入二进制文件、网络响应 |
Reader | 输入 | 字符 | 读取文本、配置文件 |
Writer | 输出 | 字符 | 写入文本、日志、模板内容 |
# 3. 学习 Java IO 的主线
建议按照下面的顺序学习:
- IO 流体系:先建立整体地图,知道每类流解决什么问题。
- 字节流和字符流:掌握最基本的文件读写。
- 缓冲流和转换流:理解性能优化和字符集转换。
- 文件 API:掌握
File、Path、Files的区别。 - 序列化和对象流:理解对象如何变成字节,以及为什么生产环境要谨慎使用。
- NIO:掌握
Buffer、Channel、Selector,理解高性能 IO 的基础。 - 高级机制:理解内存映射、零拷贝、BIO/NIO/AIO。
- 实践优化:掌握大文件处理、资源关闭、异常处理、乱码排查、性能分析。
# 4. 本章节目录
# 4.1 IO 基础
# 4.2 常用 IO 流
# 4.3 文件与目录操作
# 4.4 Java NIO
# 4.5 高级主题
# 4.6 实践与性能优化
# 4.7 面试与设计题
# 4.8 实践速查
# 5. Java IO 知识面速查
| 知识面 | 要掌握什么 | 典型风险 |
|---|---|---|
| 流体系 | 输入/输出、字节/字符、节点流/处理流 | 只背类名,不会按场景选型 |
| 文件 API | File、Path、Files | 忽略权限、符号链接、异常信息 |
| 字符集 | 编码、解码、乱码定位 | 依赖默认编码 |
| 缓冲 | 减少底层 IO 调用 | 忘记刷新或缓冲过大 |
| 序列化 | 对象与字节转换 | 反序列化安全和兼容性 |
| NIO | Buffer、Channel、Selector | 忘记 flip、半包、空轮询 |
| 高级性能 | MappedByteBuffer、零拷贝 | 过早优化,忽略真实瓶颈 |
| 工程实践 | 资源关闭、大文件、可靠写入 | 泄漏句柄、OOM、半写入 |
# 6. Tips 快问快答
Q:Java IO 学习主线是什么? A:先掌握流体系和文件读写,再学习资源管理、字符集、序列化,最后理解 NIO、零拷贝和性能排查。
Q:什么时候用字节流? A:处理图片、视频、压缩包、网络协议等二进制数据时用字节流。
Q:什么时候用字符流? A:处理文本时用字符流,并显式指定字符集。
Q:新代码优先用 File 还是 Files?
A:优先用 Path 和 Files,它们异常表达和文件系统能力更完整。
Q:Java IO 最常见线上坑是什么? A:资源未关闭、默认编码导致乱码、大文件一次性入内存、写文件失败留下半文件。
Q:NIO 的核心模型是什么? A:Buffer 管数据,Channel 管通道,Selector 管多路事件。
Q:为什么 IO 章节要学操作系统知识? A:文件描述符、页缓存、系统调用、零拷贝和网络多路复用都依赖操作系统机制。
Q:IO 性能优化第一步是什么? A:先确认瓶颈在磁盘、网络、CPU、内存、锁还是下游服务,再选择优化方案。
# 7. 总结
Java IO 不是一组孤立 API,而是一套围绕“数据如何进出程序”建立起来的体系。新手阶段要会用,中级阶段要理解流体系和资源管理,高级阶段要能从操作系统、JVM、网络模型、性能瓶颈角度分析问题。
真正掌握 Java IO 的标志不是能背出多少类名,而是遇到一个真实场景时,能判断应该使用字节流还是字符流、是否需要缓冲、是否存在字符集问题、文件多大、是否需要随机访问、能否用 NIO 或零拷贝优化,以及失败时如何保证资源正确释放。