Java IO
一、Java数据流的分类
1. 字节流(Byte Stream)
- 特点:以字节(8位)为单位读写数据,适用于所有类型文件(包括二进制文件如图片、音频、视频等)。
- 类命名规则:以
Stream
结尾(如InputStream
、OutputStream
)。 - 常见实现类:
- 文件操作:
FileInputStream
/FileOutputStream
- 缓冲优化:
BufferedInputStream
/BufferedOutputStream
- 文件操作:
2. 字符流(Character Stream)
- 特点:以字符(Unicode编码)为单位读写数据,仅适用于文本文件(如
.txt
、.csv
等)。 - 类命名规则:以
Reader
或Writer
结尾(如Reader
、Writer
)。 - 常见实现类:
- 文件操作:
FileReader
/FileWriter
- 缓冲优化:
BufferedReader
/BufferedWriter
- 编码转换:
InputStreamReader
/OutputStreamWriter
(可指定字符集)
- 文件操作:
二、关键注意事项
-
字节流的通用性
字节流可处理所有文件类型(包括文本),但字符流仅限文本。若用字符流读取二进制文件(如.jpg
),会导致数据损坏。 -
字符流的编码优势
字符流默认使用Unicode编码,自动处理本地字符集转换,避免乱码(例如读取UTF-8文本时无需手动编解码)。 -
性能优化
- 优先使用缓冲流(如
BufferedInputStream
、BufferedReader
)减少IO操作次数。 - 字符流底层仍依赖字节流,通过
InputStreamReader
转换(如new InputStreamReader(new FileInputStream("file.txt"), "UTF-8")
)。
- 优先使用缓冲流(如
三、代码示例对比
字节流读取文件(适合任意文件)
try (InputStream is = new FileInputStream("data.bin")) {int byteData;while ((byteData = is.read()) != -1) {System.out.print((byte) byteData); // 按字节处理}
}
字符流读取文本(避免乱码)
try (Reader reader = new FileReader("text.txt")) {int charData;while ((charData = reader.read()) != -1) {System.out.print((char) charData); // 按字符处理}
}
四、如何选择?
- 非文本文件 → 字节流
- 文本文件 → 字符流(尤其需处理多语言编码时)
- 需要高效IO → 组合缓冲流(如
BufferedReader
+FileReader
)