Java学习24

上午 3h:字符流全套核心

1. 字符流概述(0.4h)

1.1 为什么需要字符流?

  • 字节流 :万能,适合图片 / 视频 / 压缩包,但读取中文会乱码
  • 字符流 :专门给纯文本设计(.txt/.java/.md/.json)
  • 字符流 = 字节流 + 编码表(自动处理中文)

1.2 核心体系

plaintext

复制代码
Reader  字符输入流(读)
  └── FileReader

Writer  字符输出流(写)
  └── FileWriter

1.3 必背规则

  • 纯文本 → 字符流
  • 非文本(图片、音频、视频)→ 字节流

2. 字符输出流 FileWriter(1.2h)

2.1 作用

往文本文件写字符 / 字符串,自动处理中文。

2.2 核心方法

  • write(int c):写单个字符
  • write(char[] ch):写字符数组
  • write(String str)直接写字符串(最常用)
  • flush():刷新缓冲区(数据写入文件)
  • close():关闭流(自带 flush

✅ 完整代码:FileWriter 覆盖写入

java

运行

复制代码
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo {
    public static void main(String[] args) throws IOException {
        // 1. 创建字符输出流(覆盖模式)
        FileWriter fw = new FileWriter("D:\\JavaDay17\\fw.txt");

        // 2. 写数据
        fw.write(97);                  // 写单个字符 a
        fw.write("中文字符没问题!");    // 直接写字符串
        fw.write("\n");                // 换行
        fw.write("Hello FileWriter");

        // 3. 关闭流(必须!自带flush)
        fw.close();
    }
}

代码解释

  • FileWriter("路径"):文件不存在自动创建
  • write(字符串):字符流最大优势,直接写中文
  • close():不关闭 → 数据留在缓冲区,文件为空

✅ 完整代码:FileWriter 追加写入(不覆盖)

java

运行

复制代码
FileWriter fw = new FileWriter("D:\\JavaDay17\\fw.txt", true);
fw.write("我是追加的内容\n");
fw.close();
  • 第二个参数 true = 追加
  • 不加 true = 覆盖(清空原有内容)

3. 字符输入流 FileReader(1.4h)

3.1 作用

读取文本文件,解决中文乱码

3.2 两种读取方式

  1. 单个字符读取(理解用)
  2. 字符数组读取(企业标准,高效)

✅ 完整代码:FileReader 字符数组读取(推荐)

java

运行

复制代码
import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo {
    public static void main(String[] args) throws IOException {
        // 1. 创建字符输入流
        FileReader fr = new FileReader("D:\\JavaDay17\\fw.txt");

        // 2. 字符数组读取(高效)
        char[] chs = new char[1024];
        int len;
        while ((len = fr.read(chs)) != -1) {
            System.out.print(new String(chs, 0, len));
        }

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

逐行解释

  • fr.read(chs):一次读一堆字符到数组
  • len:读到的有效字符个数
  • new String(chs,0,len):把有效字符转成字符串
  • 读到 -1 = 文件结束

下午 2.5h:IO 异常处理 + 缓冲流

1. IO 流标准异常处理(1h)

1.1 为什么必须处理?

  • 流不关闭 → 文件被锁定、资源泄漏
  • 不捕获异常 → 程序直接崩溃

1.2 JDK7 最优雅写法:try-with-resources

**自动关闭流,不用写 close ()**企业开发 100% 用这个!


✅ 完整代码:标准异常处理(必背)

java

运行

复制代码
import java.io.FileReader;
import java.io.FileWriter;

public class IOTryResource {
    public static void main(String[] args) {
        // 自动释放资源,不用close()
        try (
            FileReader fr = new FileReader("源文件.txt");
            FileWriter fw = new FileWriter("目标文件.txt");
        ) {
            char[] chs = new char[1024];
            int len;
            while ((len = fr.read(chs)) != -1) {
                fw.write(chs, 0, len);
            }
            System.out.println("复制完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

优势

  • 自动关闭流
  • 代码极简
  • 不会资源泄漏

2. 缓冲流原理(0.5h)

2.1 为什么快?

  • 普通流:一次读写 1 个字节 / 字符 → 慢
  • 缓冲流:自带8192 缓冲区 → 一次读写一大块 → 快 10~100 倍

2.2 四大缓冲流

plaintext

复制代码
字节缓冲流
  BufferedInputStream(高效读)
  BufferedOutputStream(高效写)

字符缓冲流
  BufferedReader(高效按行读)
  BufferedWriter(高效按行写)

3. 四大缓冲流实操(1h)

3.1 字节缓冲流:复制大文件(图片 / 视频)

✅ 完整代码(企业标准)

java

运行

复制代码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class BufferCopy {
    public static void main(String[] args) {
        try (
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream("1.jpg"));
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.jpg"));
        ) {
            byte[] bys = new byte[8192];
            int len;
            while ((len = bis.read(bys)) != -1) {
                bos.write(bys, 0, len);
            }
            System.out.println("复制完成!速度极快");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.2 字符缓冲流(重点:特有方法)

BufferedReader:readLine () 读取一行 BufferedWriter:newLine () 跨平台换行


✅ 完整代码:按行读取文本(超级常用)

java

运行

复制代码
import java.io.BufferedReader;
import java.io.FileReader;

public class BufferReaderLine {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("fw.txt"))) {
            String line;
            // 一次读一行,直到null
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

✅ 完整代码:按行写入 + 跨平台换行

java

运行

复制代码
import java.io.BufferedWriter;
import java.io.FileWriter;

public class BufferWriterDemo {
    public static void main(String[] args) {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"))) {
            bw.write("第一行");
            bw.newLine(); // 跨平台换行
            bw.write("第二行");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

晚上 1.5h:综合练习 + 复盘巩固

练习 1:文本文件复制(字符流标准案例)

java

运行

复制代码
import java.io.FileReader;
import java.io.FileWriter;

public class TextCopy {
    public static void main(String[] args) {
        try (
            FileReader fr = new FileReader("a.txt");
            FileWriter fw = new FileWriter("b.txt");
        ) {
            char[] chs = new char[1024];
            int len;
            while ((len = fr.read(chs)) != -1) {
                fw.write(chs, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

练习 2:缓冲流按行读取 + 打印

java

运行

复制代码
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (Exception e) {
    e.printStackTrace();
}

我为你补充的【计划遗漏的关键知识点】

非常重要,考试 / 面试必问

1. 编码问题(GBK / UTF-8)

  • FileReader/FileWriter 默认使用系统编码
  • 乱码解决:使用 InputStreamReader / OutputStreamWriter 指定编码

2. flush 与 close 的区别

  • flush:刷新缓冲区,流还可以继续用
  • close:关闭流,刷新缓冲区,流不能再用

3. 换行规范

  • \n:Linux/Mac
  • \r\n:Windows
  • newLine():跨平台自动适配

4. 资源泄漏危害

  • 不关闭流 → 文件占用 → 无法删除 / 修改

5. 缓冲区大小

  • 默认 8192(8KB)
  • 开发固定写 81921024*8

今日终极总结(必背)

  1. 纯文本用字符流,其他用字节流
  2. 字符流解决中文乱码
  3. 缓冲流 = 高速读写
  4. 字符缓冲流最强:readLine () /newLine ()
  5. 企业必须用 try-with-resources 自动关流
  6. 不关闭流 = 文件损坏 / 无法写入 / 资源泄漏

总结

Java 字节流 & 字符流 超精炼总结 + 对照表

一、核心一句话总总结

  1. 字节流 :底层原始字节,万能 ,能复制所有文件 (图片 / 视频 / 音频 / 压缩包 / 文本),读写中文需手动转 getBytes(),容易乱码。
  2. 字符流 :字节流 + 编码表,只适合纯文本 (txt/java/md),天生处理中文不乱码,可直接读写字符串,不能复制图片视频
  3. 输入流 :数据从硬盘进程序 → 读文件
  4. 输出流 :数据从程序出到硬盘 → 写文件
  5. 缓冲流 :给基础流套一层缓冲区,大幅提高读写效率,字符缓冲流独有按行读写方法。

二、字节流 vs 字符流 详细对比表

表格

对比维度 字节流 字符流
顶层父类 InputStream / OutputStream Reader / Writer
常用基础类 FileInputStream / FileOutputStream FileReader / FileWriter
缓冲流 BufferedInputStream / BufferedOutputStream BufferedReader / BufferedWriter
处理单位 一个字节 一个字符
适用文件 所有文件:图片、视频、音频、exe、压缩包、文本 只适合纯文本:txt、java、md
中文支持 不自带编码,需手动 getBytes(),易乱码 自带编码表,中文天然不乱码
读写字符串 无直接写字符串方法,必须转字节数组 可直接 write(字符串),无需转换
文件自动创建 FileOutputStream 文件不存在自动创建 FileWriter 文件不存在自动创建
追加写入 构造方法传 true 构造方法传 true
特有方法 无特有便捷方法 BufferedReaderreadLine()、BufferedWriternewLine()
能否复制图片 ✅ 可以 ❌ 不可以,复制后损坏 0KB
效率 基础流慢,缓冲流快 基础流慢,缓冲流快

三、使用场景选择口诀(必背)

看文件选流:

  • 图片、视频、音乐、压缩包、exe → 只用字节流
  • txt、java 源码、纯文本 → 优先字符流

看动作选流:

  • 读文件(硬盘→程序)→ InputStream / Reader
  • 写文件(程序→硬盘)→ OutputStream / Writer

四、四大基础流固定用法记忆

  1. 字节读:FileInputStream → byte [] 数组循环读
  2. 字节写 :FileOutputStream → 字符串要 .getBytes()
  3. 字符读:FileReader → char [] 数组循环读,中文不乱码
  4. 字符写:FileWriter → 直接 write (字符串)

五、缓冲流额外重点(补充)

  1. 缓冲流不能单独用,必须包装基础流
  2. 字节缓冲流:只提升速度,无特殊方法
  3. 字符缓冲流:
    • readLine():一次性读一整行文本
    • newLine():跨平台自动换行,比 \n 专业

六、你以后永远不会错的规则

  1. 复制图片 / 视频 绝对不用字符流,必损坏、0KB 打不开
  2. 写纯文本中文 优先字符流,省事不乱码
  3. 所有 IO 流用完必须关闭 ,企业开发用 try-with-resources 自动关
  4. 只要路径不对 → 找不到文件 → 复制出 0KB 空文件
相关推荐
挨踢ren1 小时前
C++虚函数:从基础到高阶
java·开发语言·jvm
IT 行者1 小时前
Spring AI 2.0.0-M5 发布:全面转向 OpenAI Java SDK
java·人工智能·spring
Resky08181 小时前
ReentrantReadWriteLock 深度解析
java·开发语言·juc
铭keny1 小时前
子系统 SSO 单点登录接入配置指南
java
电商API_180079052472 小时前
淘宝商品评论数据获取指南|批量自动化|api应用
java·爬虫·spring·性能优化·自动化
梦梦代码精2 小时前
Likeshop一个开源商城到底有哪些功能模块?
java·低代码·开源·php
java1234_小锋2 小时前
Spring AI 2.0 开发Java Agent智能体 - 对话与提示词工程(Prompt)
java·人工智能·spring
谙弆悕博士2 小时前
Python快速学习——第5章:集合
python·学习
Frank_refuel2 小时前
C++之STL->string类的使用和实现
java·开发语言·c++