【Java 入门 Day25】 IO 流下篇:字符流 + 桥转换流 + File 工具类,解决文本乱码 & 文件管理难题

AI2天前发布 beixibaobao
6 0 0

家人们!上篇啃完万能字节流,今天专攻文本专用字符流、编码乱码解决方案、桥转换流,还有单独管理文件本体的 File 类,写日志、读取 txt、遍历文件夹全靠这套!

一、字符编码:乱码元凶全在这

所有文字传输本质是字符转二进制(编码)、二进制转回文字(解码),编码解码格式不一样直接全是问号乱码。 主流编码简单科普:

  1. ISO8859-1:西欧英文,单字节,不支持中文
  2. GBK/GB2312/GB18030:中文编码,GB2312 仅 6000 常用汉字,GBK 兼容两万汉字
  3. Big5:繁体中文
  4. UTF-8:万国通用编码,英文 1 字节、汉字 2~3 字节,项目标准编码

二、字符流顶层父类(抽象类,只操作纯文本)

  • Reader:字符输入流,读 txt 文本
  • Writer:字符输出流,写 txt、java、html 文本

三、字符节点流:FileReader / FileWriter

对标字节 File 流,只处理文本文件

FileWriter 文件字符输出流

构造路径写法和 FileOutputStream 完全一致,支持追加 / 覆盖。 三个 write 方法:

  1. write(int n):单个字符写入
  2. write(String str):直接整段字符串写入(比字节流省事百倍)
  3. write(char[] cs):字符数组批量写入

FileReader 文件字符输入流

两个 read 方法:

  1. read():读取单个字符,末尾返回 – 1
  2. read(char[] cs):批量读取字符进数组,返回读取长度

四、字符过滤流,文本开发神器

1. BufferedReader 缓冲字符读流

王牌方法readLine():一次性读取一整行文本,读到文件末尾返回 null,遍历日志、小说文本标配! 示例标准代码:

java运行

FileReader fr = new FileReader("c.txt");
BufferedReader br = new BufferedReader(fr);
while(true){
    String line = br.readLine();
    if(line == null) break;
    System.out.println(line);
}
br.close(); // 只关外层过滤流即可,内层自动释放

2. PrintWriter 打印输出流

开发日志打印、导出文本首选,功能拉满:

  1. 支持 8 大基础数据类型输出
  2. println()自动换行,print()不换行
  3. println(Object obj):自动调用对象 toString,只存文字,不需要序列化接口
  4. 自带缓冲,操作简单易用

五、桥转换流:字节流 ↔ 字符流转换器(解决乱码核心)

InputStreamReader(字节转字符输入)、OutputStreamWriter(字节转字符输出) 核心两大作用:

  1. 打通字节流和字符流,实现互相包装转换
  2. 手动指定读写编码,彻底解决中文乱码问题! 标准使用步骤:
  3. 创建字节节点流(FileInputStream/FileOutputStream)
  4. 套桥转换流,同时指定 UTF-8/GBK 编码
  5. 外层包装 BufferedReader/PrintWriter 增强读写
  6. 只关闭最外层流,底层资源自动释放

六、File 类:专门管理文件 / 文件夹本体(和 IO 流区分开)

核心区别一句话分清

  • IO 流:操作文件里面的内容,读文字、写数据、复制文件
  • File 类:操作文件 / 文件夹外壳本身,创建删除文件、重命名、遍历文件夹,不读写内容

高频常用方法

  • getName():获取文件名(带后缀)
  • getAbsolutePath():获取文件完整绝对路径(开发调试必备)
  • isFile():判断当前对象是不是文件
  • isDirectory():判断是不是文件夹
  • listFiles():获取文件夹下所有子文件、子文件夹数组

递归遍历文件夹筛选.java 文件经典案例

java运行

public static void selectAllEndJava(File file){
    File[] fs = file.listFiles();
    for(File f : fs){
        if(f.isFile()){
            String name = f.getName();
            if(name.endsWith(".java")){
                System.out.println(f.getAbsolutePath());
            }
        }else{
            // 文件夹递归继续遍历
            selectAllEndJava(f);
        }
    }
}

逻辑:拿到文件夹所有子项,是文件就判断后缀打印路径;是文件夹就递归深挖。

七、IO 全体系思维导图极简总结

1. 字节流(全能,所有文件)

父类:InputStream / OutputStream

  • 节点流:FileInputStream、FileOutputStream
  • 过滤流:Buffered 缓冲流、Data 基础类型流、Object 对象序列化流

2. 字符流(仅纯文本)

父类:Reader / Writer

  • 节点流:FileReader、FileWriter
  • 过滤流:BufferedReader、PrintWriter
  • 桥转换流:InputStreamReader、OutputStreamWriter(编码转换、字节字符互通)

3. File 类

独立体系,只管理文件外壳,不读写内部内容,递归遍历、增删改文件专用。

收尾碎碎念

日常开发分场景选流:图片视频压缩包用字节缓冲流;日志、txt 文档优先字符 Buffered+PrintWriter;有中文乱码直接上桥转换流指定编码;需要保存对象用 Object 流;批量遍历文件夹文件直接 File 递归。IO 所有流用完必须 close 释放资源,不然长期运行疯狂内存泄漏踩大坑!

© 版权声明

相关文章