Java IO流入门:从零开始理解输入输出
一、什么是IO流?
IO就是 Input/Output(输入/输出)的缩写。
你可以把它想象成水流:
输入流(Input):水从外面流进你的杯子里 → 数据从文件/键盘读到程序里
输出流(Output):水从杯子里倒出去 → 数据从程序写到文件/屏幕上
**简单记:**输入 = 读数据,输出 = 写数据。

二、IO流的分类

分类 说明 常见类
字节流 以字节(8bit)为单位,能处理任意文件(图片、视频、文本等) InputStreamOutputStream
字符流 以字符为单位,专门处理文本文件 ReaderWriter

三、最常用的类

3.1 文件读取:FileReader

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

public class Demo1 {
    public static void main(String[] args) {
        try {
            FileReader fr = new FileReader("test.txt");
            int ch;
            // read()每次读一个字符,读到末尾返回-1
            while ((ch = fr.read()) != -1) {
                System.out.print((char) ch);
            }
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行前提: 当前目录下要有 test.txt 文件,里面随便写点内容。
逐行解释:
new FileReader(“test.txt”) → 打开文件,准备读
fr.read() → 每次读一个字符,返回字符的编码值,读完返回 -1
(char) ch → 把数字转成字符打印
fr.close() → 用完记得关闭,不然资源泄漏

3.2 文件写入:FileWriter

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

public class Demo2 {
    public static void main(String[] args) {
        try {
            FileWriter fw = new FileWriter("output.txt");
            fw.write("Hello,大一的同学们!\n");
            fw.write("IO流没那么难!");
            fw.close();
            System.out.println("写入成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果: 当前目录下会生成 output.txt,内容就是你写入的文字。
注意:
new FileWriter(“output.txt”) → 如果文件不存在会自动创建;如果存在会覆盖
想追加内容不覆盖?改成 new FileWriter(“output.txt”, true)

3.3 带缓冲的读取:BufferedReader(按行读取)

逐字符读太慢了,BufferedReader 可以一次读一整行:

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

public class Demo3 {
    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new FileReader("test.txt"));
            String line;
            // readLine()每次读一行,读到末尾返回null
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

为什么要用BufferedReader?
**FileReader:**一个一个字符读,慢
**BufferedReader:**有一块缓冲区,一次读一批,快!而且支持 readLine() 按行读

3.4 带缓冲的写入:BufferedWriter

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

public class Demo4 {
    public static void main(String[] args) {
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter("output2.txt"));
            bw.write("第一行");
            bw.newLine(); // 换行
            bw.write("第二行");
            bw.newLine();
            bw.write("第三行");
            bw.close();
            System.out.println("写入完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

四、try-with-resources 写法(推荐!)
每次都要手动 close() 太麻烦,这个是自动关闭的写法:

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

public class Demo5 {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 不需要写close(),程序自动关闭
    }
}

把创建流的代码写在 try() 的小括号里,程序结束时会自动帮你关闭,省心!

五、字节流:处理非文本文件
如果要复制图片、音频等文件,必须用字节流

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

public class Demo6 {
    public static void main(String[] args) {
        try (
            FileInputStream fis = new FileInputStream("source.jpg");
            FileOutputStream fos = new FileOutputStream("copy.jpg")
        ) {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
            System.out.println("复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

原理: 读一块写一块,就像搬砖一样,一次搬一车,搬完为止

六、总结

场景 推荐用的类
读取文本文件(按行) BufferedReader + FileReader
写入文本文件(按行) BufferedWriter + FileWriter
复制图片/音频/视频 FileInputStream + FileOutputStream
从键盘读取 Scanner(其实也是IO流的一种)

核心思路:
1.创建流(打开通道)
2.读取流
3.操作流
4.关闭流(用 try-with-resources 可以省略)

IO流就是这么回事,多写几次代码就熟了!