字节流处理二进制数据,字符流处理文本并需显式指定编码;选流须依文件类型:图片/视频等用字节流,文本文件优先字符流;禁用默认编码,强制使用UTF-8等明确编码;务必使用缓冲流和try-with-resources。

字节流和字符流不是并列的两种技术,而是面向不同数据类型的分工体系:字节流管“原始搬运”,字符流管“文本解码”。实战演练的关键不在多写代码,而在理解场景、选对流、避开编码陷阱。
明确文件类型,决定用哪一套流
这是最基础也最容易出错的一步。别凭感觉,看后缀更要看内容:
- 必须用字节流:.jpg、.png、.mp4、.zip、.pdf、.class —— 这些是二进制格式,每个字节都有特定含义,用字符流读写会破坏结构(比如图片打不开、jar包无法加载)
- 优先用字符流:.txt、.java、.properties、.csv、.json、.xml —— 这些是纯文本,字符流自动按指定编码(如UTF-8)解码,避免手动处理字节数组和乱码
- 特殊情况要混合用:比如读取一个含中文路径的ZIP文件,解压时用字节流处理ZIP结构,提取出内部的 .txt 文件后再用字符流读内容
字符流必须显式指定编码,不能依赖默认
FileReader/FileWriter 的无参构造方法使用平台默认编码(Windows 是 GBK,Linux/macOS 是 UTF-8),跨环境必乱码。实战中一律禁用:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- ✅ 正确写法:new InputStreamReader(new FileInputStream("a.txt"), "UTF-8")
- ✅ 更推荐:Files.newBufferedReader(Paths.get("a.txt"), StandardCharsets.UTF_8)
- ❌ 危险写法:new FileReader("a.txt") —— 本地跑通,上线就崩
字节流处理文本时,编码转换要一步到位
如果因某些原因必须用 FileInputStream 读文本(比如需要跳过文件头、或与底层协议对接),就不能直接 new String(bytes):
立即学习“Java免费学习笔记(深入)”;
- 必须传入编码名:new String(bytes, 0, len, "UTF-8")
- 写入同理:fos.write("你好".getBytes(StandardCharsets.UTF_8))
- 注意:
String.getBytes()不带参数时也用平台默认编码,等同于埋雷
性能与资源管理,从第一天就要养成习惯
基础流(FileInputStream/FileOutputStream)效率低、易泄漏,实战中应直接上手带缓冲的组合:
- 文本读写:用 BufferedReader / BufferedWriter,支持
readLine()和newLine() - 字节读写:用 BufferedInputStream / BufferedOutputStream,默认 8KB 缓冲区,比单字节快数十倍
- 资源关闭:全部用 try-with-resources,不用手写 finally —— 这不是可选项,是硬性规范

















