家人们!上篇啃完万能字节流,今天专攻文本专用字符流、编码乱码解决方案、桥转换流,还有单独管理文件本体的 File 类,写日志、读取 txt、遍历文件夹全靠这套!
一、字符编码:乱码元凶全在这
所有文字传输本质是字符转二进制(编码)、二进制转回文字(解码),编码解码格式不一样直接全是问号乱码。 主流编码简单科普:
- ISO8859-1:西欧英文,单字节,不支持中文
- GBK/GB2312/GB18030:中文编码,GB2312 仅 6000 常用汉字,GBK 兼容两万汉字
- Big5:繁体中文
- UTF-8:万国通用编码,英文 1 字节、汉字 2~3 字节,项目标准编码
二、字符流顶层父类(抽象类,只操作纯文本)
Reader:字符输入流,读 txt 文本Writer:字符输出流,写 txt、java、html 文本
三、字符节点流:FileReader / FileWriter
对标字节 File 流,只处理文本文件
FileWriter 文件字符输出流
构造路径写法和 FileOutputStream 完全一致,支持追加 / 覆盖。 三个 write 方法:
write(int n):单个字符写入write(String str):直接整段字符串写入(比字节流省事百倍)write(char[] cs):字符数组批量写入
FileReader 文件字符输入流
两个 read 方法:
read():读取单个字符,末尾返回 - 1read(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 打印输出流
开发日志打印、导出文本首选,功能拉满:
- 支持 8 大基础数据类型输出
println()自动换行,print()不换行println(Object obj):自动调用对象 toString,只存文字,不需要序列化接口- 自带缓冲,操作简单易用
五、桥转换流:字节流 ↔ 字符流转换器(解决乱码核心)
InputStreamReader(字节转字符输入)、OutputStreamWriter(字节转字符输出) 核心两大作用:
- 打通字节流和字符流,实现互相包装转换
- 手动指定读写编码,彻底解决中文乱码问题! 标准使用步骤:
- 创建字节节点流(FileInputStream/FileOutputStream)
- 套桥转换流,同时指定 UTF-8/GBK 编码
- 外层包装 BufferedReader/PrintWriter 增强读写
- 只关闭最外层流,底层资源自动释放
六、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 释放资源,不然长期运行疯狂内存泄漏踩大坑!