一、前言

在 Java 开发中,文件读写、数据传输都离不开 IO 流(输入输出流)。IO 流是程序与外部设备(文件、网络、键盘等)之间传输数据的通道。

本文重点讲解:

  • IO 流的基本概念与分类
  • 文件字节流(FileInputStream / FileOutputStream)
  • 文件字符流(FileReader / FileWriter)
  • 二者区别与使用场景
  • 作业高频代码示例

内容通俗易懂,适合课程作业、复习、面试使用。


二、IO 流的基本概念

1. 什么是输入流、输出流

  • 输入流(Input):从 外部 → 程序 读取数据
  • 输出流(Output):从 程序 → 外部 写出数据

可以简单记: 以程序为中心,进为输入,出为输出。

2. IO 流的两大分类

  1. 按数据类型

    • 字节流:以 字节(byte) 为单位,可读写所有文件(文本、图片、音频、视频等)
    • 字符流:以 字符(char) 为单位,只能读写纯文本文件
  2. 按功能方向

    • 输入流
    • 输出流

三、文件字节流(万能流)

文件字节流是最通用的流,可以处理任何类型的文件。

1. 核心类

  • FileInputStream:文件字节输入流(读文件)
  • FileOutputStream:文件字节输出流(写文件)

2. 适用场景

图片、音频、视频、压缩包、文本文件 全都能读写

3. 文件字节输入流(读取文件)

java

运行

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamDemo {
    public static void main(String[] args) throws IOException {
        // 1. 创建字节输入流
        FileInputStream fis = new FileInputStream("test.txt");

        // 2. 读取数据(一个字节一个字节读)
        int b;
        while ((b = fis.read()) != -1) {
            System.out.print((char) b);
        }

        // 3. 关闭流
        fis.close();
    }
}

4. 文件字节输出流(写入文件)

java

运行

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo {
    public static void main(String[] args) throws IOException {
        // 第二个参数 true:追加写入,false/不写:覆盖写入
        FileOutputStream fos = new FileOutputStream("test.txt", true);

        // 写入数据
        fos.write("Hello Java IO!\n".getBytes());
        fos.write("文件字节流测试".getBytes());

        fos.close();
    }
}

四、文件字符流(专门读写纯文本)

字符流以字符为单位,专门解决中文乱码问题,只能读写纯文本文件。

1. 核心类

  • FileReader:文件字符输入流(读文本)
  • FileWriter:文件字符输出流(写文本)

2. 适用场景

只用于:.txt.java.md纯文本文件

3. 文件字符输入流

java

运行

import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("test.txt");

        int ch;
        while ((ch = fr.read()) != -1) {
            System.out.print((char) ch);
        }

        fr.close();
    }
}

4. 文件字符输出流

java

运行

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo {
    public static void main(String[] args) throws IOException {
        // true 表示追加
        FileWriter fw = new FileWriter("test.txt", true);

        fw.write("\n我是字符流写入的中文");
        fw.write("\n读写中文不会乱码!");

        fw.close();
    }
}

五、字节流 vs 字符流(作业必背)

1. 区别

表格

对比项 字节流(Byte Stream) 字符流(Character Stream)
基本单位 字节(8 bit) 字符(char)
操作文件 所有类型文件(万能) 仅纯文本文件
中文处理 可能出现乱码 专门处理中文,不乱码
核心类 FileInputStream/FileOutputStream FileReader/FileWriter
是否需要缓冲区 建议使用 建议使用

2. 使用选择

  • 读写图片、音频、视频、文件拷贝 → 用字节流
  • 读写纯文本、中文 → 用字符流

六、文件拷贝案例(字节流实现)

作业最常考:文件复制代码

java

运行

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {
    public static void main(String[] args) throws IOException {
        // 1. 创建输入输出流
        FileInputStream fis = new FileInputStream("source.jpg");
        FileOutputStream fos = new FileOutputStream("copy.jpg");

        // 2. 一边读一边写
        byte[] buffer = new byte[1024]; // 缓冲区
        int len;
        while ((len = fis.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }

        // 3. 关闭流(后开先关)
        fos.close();
        fis.close();

        System.out.println("文件拷贝成功!");
    }
}

七、IO 流使用注意事项

  1. 流使用完毕必须关闭(close ()),否则会造成资源泄漏
  2. 读写文件时可能产生 IOException,需要捕获或抛出
  3. 字节流适合所有文件,字符流只适合文本
  4. 大型文件读写建议使用 缓冲区 提高效率
  5. 字符流能有效避免中文乱码问题

八、总结

  1. Java IO 流分为输入流输出流,以程序为中心。
  2. 按数据类型分为字节流字符流
  3. 文件字节流:万能流,可读写任何文件。
  4. 文件字符流:文本专用,读写中文不乱码。
  5. 字节流核心类:FileInputStream / FileOutputStream
  6. 字符流核心类:FileReader / FileWriter
  7. 实际开发:拷贝文件用字节流,读写文本用字符流。

 

更多推荐