字节流以byte为单位处理任意二进制数据,不涉及编码;字符流以char为单位专用于文本,自动处理编码转换;字符流底层封装字节流,二者是上下层关系而非并列。

数据单位不同,本质就不同
字节流以 byte(8位) 为最小处理单位,能读写任意二进制数据,比如一个 JPEG 文件里的每个像素信息、一个 ZIP 压缩包的结构字节——它不关心这些字节“代表什么”,只负责原样搬运。
字符流以 char(16位 Unicode 字符) 为单位,专为文本设计。它看到的不是 0x41,而是字母 'A';不是 0xE4BDA0,而是汉字 '你'。背后自动做了编码转换,所以你传入 UTF-8,它就按 UTF-8 解码字节再拼成字符。
编码处理是关键分水岭
字节流完全不碰编码:FileInputStream 读出来就是 raw bytes,你用 new String(bytes) 解释错编码,立马乱码;
字符流天生带编码意识:FileReader 默认用系统默认编码(可能出问题),但 InputStreamReader + FileInputStream 组合可以明确指定 StandardCharsets.UTF_8,读的时候自动解码,写的时候自动编码,省心且安全。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
类体系和使用习惯有明显倾向
字节流基类是 InputStream / OutputStream,典型子类包括 FileInputStream、BufferedOutputStream、ObjectOutputStream;
字符流基类是 Reader / Writer,典型子类包括 FileReader、BufferedWriter、PrintWriter。
常见操作差异:
• 想逐行读文本?用 BufferedReader.readLine(),字符流专属便利方法;
• 要写 Java 对象到文件?必须用 ObjectOutputStream(字节流),字符流做不到;
• 复制一张 PNG 图片?只能用字节流,用 FileWriter 写进去会直接损坏文件。
它们不是并列关系,而是上下层关系
字符流不是独立实现的,它底层一定包装了一层字节流。例如:
• InputStreamReader = FileInputStream + 编码器,把字节流“翻译”成字符流;
• OutputStreamWriter = FileOutputStream + 编码器,把字符流“翻译”回字节流。
这意味着:处理文本时,字符流更安全、更语义清晰;需要精细控制原始字节(比如加解密、协议解析、大文件校验),就必须用字节流。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










