一、IO 流核心概念与整体体系

1. 什么是 IO 流

IO:Input 输入、Output 输出流:数据在设备间按字节 / 字符顺序传输的通道,Java IO 用于文件读写、网络传输、数据持久化

2. IO 流两大核心分类

IO流
├─ 字节流:以 1字节(8bit) 为单位
│   适合:图片、视频、音频、压缩包、所有二进制文件
│   顶层父类:InputStream / OutputStream
└─ 字符流:以 1字符 为单位,底层=字节流+编码表
    适合:纯文本文件 txt/java/html
    顶层父类:Reader / Writer

3. 四大抽象基类总览

  • 字节输入:InputStream
  • 字节输出:OutputStream
  • 字符输入:Reader
  • 字符输出:Writer

四大基类都是抽象类,不能直接 new,只能用子类实现。


二、字符流体系(Reader / Writer)

1. 字符输入流 Reader

继承层级简图

Reader 抽象父类
├─ FileReader  文件字符输入流
├─ InputStreamReader  字节转字符转换流
└─ BufferedReader  缓冲字符输入流(高效、按行读)

各类作用

  1. FileReader:直接按字符读取文本文件,使用默认编码。
  2. InputStreamReader转换流,把字节流转字符流,可手动指定编码,解决乱码。
  3. BufferedReader:带缓冲区,效率高,独有 readLine() 按整行读取。

完整代码示例(try-with-resources 自动关流)

import java.io.*;

public class CharInputDemo {
    public static void main(String[] args) {
        // 1. FileReader 单个字符读取
        try (FileReader fr = new FileReader("test.txt")) {
            int ch;
            while ((ch = fr.read()) != -1) {
                System.out.print((char) ch);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 2. 转换流 指定UTF-8编码
        try (InputStreamReader isr = new InputStreamReader(new FileInputStream("test.txt"), "UTF-8")) {
            int ch;
            while ((ch = isr.read()) != -1) {
                System.out.print((char) ch);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 3. BufferedReader 按行读取
        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. 字符输出流 Writer

继承层级简图

Writer 抽象父类
├─ FileWriter  文件字符输出流
├─ OutputStreamWriter  字符转字节转换流
└─ BufferedWriter  缓冲字符输出流

各类作用

  1. FileWriter:向文本文件写入字符,默认覆盖原文件。
  2. OutputStreamWriter:转换流,指定编码写入,防止乱码。
  3. BufferedWriter:缓冲高效写入,独有 newLine() 跨平台换行。

完整代码示例

import java.io.*;

public class CharOutputDemo {
    public static void main(String[] args) {
        // 1. FileWriter 基础写入
        try (FileWriter fw = new FileWriter("output.txt")) {
            fw.write("Hello World");
            fw.write("\nJava IO学习");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 2. 转换流 指定编码
        try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8")) {
            osw.write("指定UTF-8编码写入");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 3. BufferedWriter 缓冲按行写入
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
            bw.write("第一行内容");
            bw.newLine();
            bw.write("第二行内容");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. Writer 五大写入方法(表格 + 代码)

方法签名 功能说明
write(int c) 写入单个字符
write(char[] cbuf) 写入整个字符数组
write(char[] cbuf,int off,int len) 从数组 off 位置开始,写入 len 个字符
write(String str) 写入整个字符串
write(String str,int off,int len) 写入字符串部分内容
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class WriterMethodDemo {
    public static void main(String[] args) {
        try (Writer writer = new FileWriter("writer_demo.txt")) {
            writer.write('H');

            char[] arr = {'e','l','l','o'};
            writer.write(arr);
            writer.write(arr,1,2);

            writer.write(" World!");

            String s = "\nThis is Java IO";
            writer.write(s,0,11);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三、字节流体系(InputStream / OutputStream)

1. 字节流特点

  • 一切文件都能用字节流读写
  • 字符流只能文本,字节流通用所有文件

2. 字节输入流 InputStream

常用核心方法:

  • read() 读单个字节,末尾返回 -1
  • read(byte[] b) 批量读入字节数组
  • read(byte[] b,int off,int len) 读指定长度
  • close() 关闭流释放资源

常用实现类:FileInputStream

代码示例

import java.io.*;

public class ByteInputDemo {
    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) {
                System.out.print(new String(buffer,0,len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 字节输出流 OutputStream

常用实现类:FileOutputStream

代码示例

import java.io.*;

public class ByteOutputDemo {
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("byte_output.txt")) {
            fos.write("中国人\r\n".getBytes());
            fos.write("ABCDEFG".getBytes(),2,4);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

四、IO 流分类总表(汇总背诵版)

流类型 抽象基类 常用实现类 适用场景
字符输入流 Reader FileReader、InputStreamReader、BufferedReader 读取文本
字符输出流 Writer FileWriter、OutputStreamWriter、BufferedWriter 写入文本
字节输入流 InputStream FileInputStream、BufferedInputStream 图片 / 视频 / 任意文件读
字节输出流 OutputStream FileOutputStream、BufferedOutputStream 图片 / 视频 / 任意文件写

五、重点补充

  1. 资源关闭IO 流占用系统资源,必须关闭;推荐 try-with-resources,自动关闭流,不用手动写 close()

  2. 缓冲流优势Buffered 开头的缓冲流:内置缓冲区,减少磁盘 IO 次数,读写效率远高于普通流

  3. 转换流核心作用InputStreamReader / OutputStreamWriter

  • 字节流 ↔ 字符流 桥梁
  • 手动指定编码,解决中文乱码问题
  1. 使用场景硬性规则
  • 文本文件:优先 字符流
  • 图片、视频、音频、压缩包:必须用 字节流
  • 禁止用字符流解析二进制文件,会损坏数据
  1. 换行区别
  • BufferedWriter.newLine():跨平台通用换行
  • \n 只适合 Linux,\r\n 适合 Windows
  1. 文件写入覆盖与追加new FileWriter("a.txt",true) / new FileOutputStream("a.txt",true)第二个参数为 true:追加写入,不覆盖原文件。

 

更多推荐