Java IO文件流常用类及分类

Java IO流主要分为字节流字符流两大类,分别处理二进制数据和文本数据。以下是常用类的分类及核心功能:

字节流(操作二进制数据)
  • 抽象基类InputStreamOutputStream
  • 文件操作实现类FileInputStreamFileOutputStream
  • 缓冲流BufferedInputStreamBufferedOutputStream
  • 对象序列化ObjectInputStreamObjectOutputStream
字符流(操作文本数据)
  • 抽象基类ReaderWriter
  • 文件操作实现类FileReaderFileWriter
  • 缓冲流BufferedReaderBufferedWriter
  • 转换流InputStreamReaderOutputStreamWriter

常用类的优缺点分析

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),避免跨平台乱码。
  • 性能权衡:小文件可直接用非缓冲流,大文件必须用缓冲流。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐