Java IO文件流常用类
·
Java IO文件流常用类及分类
Java IO流主要分为字节流和字符流两大类,分别处理二进制数据和文本数据。以下是常用类的分类及核心功能:
字节流(操作二进制数据)
- 抽象基类:
InputStream、OutputStream - 文件操作实现类:
FileInputStream、FileOutputStream - 缓冲流:
BufferedInputStream、BufferedOutputStream - 对象序列化:
ObjectInputStream、ObjectOutputStream
字符流(操作文本数据)
- 抽象基类:
Reader、Writer - 文件操作实现类:
FileReader、FileWriter - 缓冲流:
BufferedReader、BufferedWriter - 转换流:
InputStreamReader、OutputStreamWriter
常用类的优缺点分析
1. FileInputStream / FileOutputStream
-
优点
直接操作文件字节流,适合读写二进制文件(如图片、音频)。
无需缓冲区,节省内存开销(适合小文件)。 -
缺点
每次读写需访问磁盘,性能较差(尤其是大文件)。
无内置缓冲机制,需手动处理字节数组。
2. BufferedInputStream / BufferedOutputStream
-
优点
内置缓冲区(默认8KB),减少磁盘I/O次数,大幅提升性能。
提供mark()和reset()方法支持重复读取。 -
缺点
缓冲区可能增加内存占用。
需手动调用flush()确保数据写入磁盘。
3. FileReader / FileWriter
-
优点
专为文本文件设计,自动处理字符编码(默认使用系统编码)。
简化字符读写操作(如readLine())。 -
缺点
无法指定编码格式,可能因系统差异导致乱码。
无缓冲区时性能较低(需配合BufferedReader使用)。
4. BufferedReader / BufferedWriter
-
优点
提供行级读写方法(如readLine()和newLine())。
缓冲区优化减少I/O操作,适合大文本文件。 -
缺点
需手动关闭流释放资源,否则可能导致数据丢失。
5. ObjectInputStream / ObjectOutputStream
-
优点
支持Java对象序列化与反序列化,方便存储复杂数据结构。
自动处理对象间的引用关系。 -
缺点
序列化后的文件不可读(二进制格式)。
类需实现Serializable接口,且serialVersionUID不匹配时会报错。
6. InputStreamReader / OutputStreamWriter
-
优点
作为桥梁连接字节流与字符流,可显式指定字符编码(如UTF-8)。
解决FileReader编码不可控的问题。 -
缺点
需结合字节流使用,代码稍显复杂。
选择建议
- 二进制文件:优先使用
BufferedInputStream/BufferedOutputStream提升性能。 - 文本文件:组合
FileInputStream+InputStreamReader+BufferedReader以控制编码和缓冲。 - 对象持久化:直接使用
ObjectOutputStream,但需注意版本兼容性。 - 大文件处理:务必使用缓冲流(如
BufferedReader),避免频繁磁盘I/O。
示例代码片段
// 使用BufferedReader读取文本文件(推荐方式)
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("file.txt"), StandardCharsets.UTF_8))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
// 使用BufferedOutputStream写入二进制文件
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("image.jpg"))) {
byte[] data = getImageData(); // 假设获取字节数据
bos.write(data);
}
注意事项
- 资源释放:所有流均应使用
try-with-resources语法自动关闭。 - 编码问题:字符流务必显式指定编码(如UTF-8),避免跨平台乱码。
- 性能权衡:小文件可直接用非缓冲流,大文件必须用缓冲流。
更多推荐


所有评论(0)