Java IO 工作机制深度解析
Java IO 类位于 java.io,分为字节流、字符流、文件、网络四大体系。本文梳理类继承结构、装饰器组合模式、同步/异步/阻塞/非阻塞概念辨析、序列化机制与实战代码。
四大体系与继承结构
| 体系 | 抽象基类 | 核心子类 | 典型用途 |
| 字节流 | InputStream / OutputStream | FileInputStream、ByteArrayInputStream、ObjectInputStream | 二进制数据、对象序列化、网络字节流 |
| 字符流 | Reader / Writer | FileReader、BufferedReader、InputStreamReader、OutputStreamWriter | 文本处理、编码转换 |
| 文件 | File | 路径操作、属性查询、目录遍历 | 文件系统抽象 |
| 网络 | Socket / ServerSocket | TCP 通信、InputStream/OutputStream 获取 | 网络字节流 |

装饰器组合模式:流的任意嵌套
// 字节流 → 字符流 → 缓冲 → 读取
InputStreamReader isr = new InputStreamReader(
new FileInputStream("haha.txt"), "utf-8");
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) { ... }
- 所有流构造器均接受同类型父类参数,实现「俄罗斯套娃」式功能叠加
FileReader = InputStreamReader + FileInputStream(默认编码)
FileWriter = OutputStreamWriter + FileOutputStream
同步/异步 vs 阻塞/非阻塞
| 维度 | 同步 | 异步 |
| 定义 | 发起调用 → 等待结果返回 → 继续 | 发起调用 → 立即返回 → 回调/通知结果 |
| 比喻 | 打电话 | 发短信 |
| 可靠性 | 高(结果确定) | 低(需额外机制保证) |
| 维度 | 阻塞 | 非阻塞 |
| 定义 | CPU 等待慢操作完成 | CPU 去干别的事,完成后再处理 |
| 代价 | 线程挂起、上下文切换 | 轮询/回调复杂度、线程切换增加 |
Java 传统 IO(BIO)= **同步阻塞**;NIO = **同步非阻塞**(Selector 轮询);AIO (NIO.2) = **异步非阻塞**(CompletionHandler)。
序列化机制
- 实现
Serializable 标记接口(无方法)
ObjectOutputStream.writeObject(obj) → 字节流(含类元数据、字段值、对象图引用追踪)
ObjectInputStream.readObject() → 反序列化,需向下转型
serialVersionUID 建议显式声明,防止版本不兼容 InvalidClassException
transient 字段跳过序列化
序列化实战代码
// 写
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("serialize.txt"))) {
oos.writeObject("start");
oos.writeObject(new Person("luoxn28", 23));
oos.writeObject(12);
}
// 读
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("serialize.txt"))) {
String s = (String) ois.readObject();
Person p = (Person) ois.readObject();
int n = (int) ois.readObject();
System.out.println(s + " | " + p + " | " + n);
}
最佳实践
- 文本处理优先
BufferedReader/Writer + 指定编码
- 大文件拷贝用
FileChannel.transferTo() 零拷贝
- 序列化对象务必声明
serialVersionUID
- 网络通信考虑 Protobuf/Thrift/Avro 等高效二进制协议替代 Java 原生序列化
- 资源管理用
try-with-resources (JDK 7+)
参考资料
- 《深入分析 Java I/O 的工作机制》
- 《Java IO 系统》
- 上一篇文章: Maven Archetype 打造專屬項目模板:從創建原型到 Nexus 發布與 IDE 整合全流程
- 下一篇文章: Java 並發編程 J.U.C 核心知識體系深度總結
Copyright ©
程式碼之家 All Rights Reserved