Java IO 流体系核心梳理
一、IO 流的两大阵营
Java IO 设计之初就明确了两种数据流向:面向字节与面向字符。选择哪种取决于你的数据类型——如果是图片、视频或任意二进制文件,必须用字节流;如果是文本文件且涉及编码问题,字符流更合适。
二、面向字节的流
1. InputStream(输入)
所有字节输入流的父类。常见子类包括:
- FileInputStream: 读取本地文件。
- ByteArrayInputStream: 从内存字节数组读取。
- BufferedInputStream: 带缓冲,大幅提升读取性能,建议包装在底层流外使用。
- ObjectInputStream: 反序列化对象,需配合 Object 类实现 Serializable 接口。
- PipedInputStream: 用于线程间通信,类似管道。
- SequenceInputStream: 合并多个输入流。
- 注意:
StringBufferInputStream已过时,请使用ByteArrayInputStream替代。
2. OutputStream(输出)
对应输出流体系,结构相似:
- FileOutputStream: 写入文件。
- ByteArrayOutputStream: 将数据写入内存缓冲区。
- BufferedOutputStream: 同样用于提升写入效率。
- PrintStream: 常用于标准输出(System.out),支持格式化打印。
- ObjectOutputStream: 序列化对象。
三、面向字符的流
1. Reader(读取)
处理 Unicode 字符,自动处理编码转换。
- BufferedReader: 高效读取文本行,支持
readLine()。 - LineNumberReader: 继承自 BufferedReader,可统计行号。
- InputStreamReader: 桥梁类,将字节流转换为字符流,需指定编码。
- FileReader: 简化版 InputStreamReader,默认使用系统编码。
- StringReader: 从字符串中读取字符。
2. Writer(写入)
- BufferedWriter: 带缓冲的字符输出,性能优于直接写。
- OutputStreamWriter: 桥梁类,将字符流转为字节流。
- FileWriter: 简化版 OutputStreamWriter。
- PrintWriter: 方便格式化输出,但需注意异常处理机制不同。
四、实用建议
在实际开发中,尽量使用 NIO 替代传统 IO 以获得更高性能。若必须使用 IO,记得利用 try-with-resources 语法自动关闭资源,避免内存泄漏。对于大文件处理,务必加上 Buffered 包装层。
( ()) {
} (IOException e) {
e.printStackTrace();
}

