如何使用Java IO流进行文件操作?

4 阅读2分钟

一、先记住 4 句核心口诀

  1. 读文件 = 输入流(InputStream / Reader)
  2. 写文件 = 输出流(OutputStream / Writer)
  3. 图片 / 视频 / 音频 = 字节流(万能)
  4. 文本文件 = 字符流(防乱码)

二、必备基础:File 类(操作文件本身)

先学会创建、判断、删除文件

java

运行

import java.io.File;
import java.io.IOException;

public class FileDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("test.txt");

        System.out.println("是否存在:" + file.exists());
        System.out.println("文件名:" + file.getName());
        System.out.println("文件大小:" + file.length());

        // 创建文件
        if (!file.exists()) {
            file.createNewFile();
            System.out.println("文件已创建");
        }

        // 删除文件
        // file.delete();
    }
}

三、最常用:字节流(复制一切文件)

适合:图片、视频、音频、压缩包、文本

1. 文件读取

java

运行

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

public class ReadByte {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("test.txt")) {
            byte[] buffer = new byte[1024];
            int len;
            // 循环读取
            while ((len = fis.read(buffer)) != -1) {
                String s = new String(buffer, 0, len);
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 文件写入

java

运行

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

public class WriteByte {
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("out.txt")) {
            String str = "Java IO 测试写入";
            fos.write(str.getBytes());
            System.out.println("写入成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 文件复制(最标准写法)

任何文件都能复制,开发必背!

java

运行

import java.io.*;

public class CopyFile {
    public static void main(String[] args) {
        try (
            BufferedInputStream in = new BufferedInputStream(new FileInputStream("原图.png"));
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("新图.png"))
        ) {
            byte[] buffer = new byte[8192];
            int len;
            while ((len = in.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
            System.out.println("复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

四、文本专用:字符流(不乱码)

适合:.txt/.java/.html 等纯文本

1. 按行读取文本(超级常用)

java

运行

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

public class ReadText {
    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();
        }
    }
}

2. 按行写入文本

java

运行

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

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

五、解决中文乱码:指定编码

java

运行

import java.io.*;

public class EncodingDemo {
    public static void main(String[] args) {
        try (
            InputStreamReader isr = new InputStreamReader(new FileInputStream("test.txt"), "UTF-8");
            BufferedReader br = new BufferedReader(isr)
        ) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

六、必须掌握:自动关闭流(JDK7+)

所有流都推荐这样写:自动关闭,不占内存

java

运行

try (创建流) {
    // 读写操作
} catch (IOException e) {
    e.printStackTrace();
}

七、快速选择用哪个流

表格

需求流选择
读取图片 / 视频BufferedInputStream
写入图片 / 视频BufferedOutputStream
读取文本BufferedReader
写入文本BufferedWriter
复制文件字节缓冲流
解决乱码InputStreamReader

八、一句话总结

  • 读 = 输入流
  • 写 = 输出流
  • 二进制文件 = 字节流
  • 文本文件 = 字符流
  • 高效 = 缓冲流
  • 安全关闭 = try-with-resources

如果你需要,我可以给你:

  1. IO 流全套练习题 + 答案
  2. 面试常考 IO 题总结
  3. 把这些代码整理成一份可直接运行的完整项目