选字节流处理二进制文件,选字符流处理文本文件:二进制文件如图片、pdf、zip等需用fileinputstream等字节流配合缓冲流,避免编码损坏;文本文件如txt、json等应使用inputstreamreader+bufferedinputstream指定utf-8编码读取,防止乱码。

选流不看类名,看数据本身长什么样:是人能直接看懂的文本,还是电脑才懂的原始字节。
处理图片、PDF、ZIP、音频等二进制文件,必须用字节流
这类文件每个字节都有固定含义,比如 JPG 文件头是 0xFF 0xD8,PDF 是 %PDF- 开头。一旦用字符流读写,编码转换会把多字节的中文或特殊符号“拆开重编”,导致文件损坏——图片打不开、压缩包解压失败、序列化对象反序列化报 StreamCorruptedException。
- 核心类:FileInputStream / FileOutputStream
- 务必加缓冲:BufferedInputStream / BufferedOutputStream(性能提升明显)
- 典型场景:文件拷贝、网络响应体下载、ObjectInputStream/ObjectOutputStream、加密/解密输入输出
读写 .txt、.json、.csv、.xml 等文本文件,优先用字符流
文本内容含中文、换行、标点、emoji,本质是 Unicode 字符。字符流自动按指定编码(如 UTF-8)完成字节 ↔ 字符转换,避免手动 new String(bytes, "UTF-8") 出错,也支持 readLine()、跳过 BOM、按字符边界切分等文本友好操作。
- 别直接用 FileReader/FileWriter:它们依赖系统默认编码,Windows 是 GBK,Linux/macOS 是 UTF-8,一换环境就乱码
- 稳妥写法:InputStreamReader + FileInputStream(传入
StandardCharsets.UTF_8) + BufferedReader - 典型场景:配置加载、日志解析、CSV 行迭代、HTML 内容提取
底层是字节流,但内容是文本(如 HTTP 响应、Socket 数据),用转换流桥接
比如从 HttpURLConnection.getInputStream() 或 ZipInputStream 里读 JSON,不能硬套 FileReader。这时 InputStreamReader 就是标准解法:它把任意 InputStream 转成 Reader,并显式控制编码,不是靠猜或试错。
-
InputStreamReader:字节输入 → 字符输入(带编码) -
OutputStreamWriter:字符输出 → 字节输出(带编码) - 这是解决“明明是文本却读出乱码”的根本手段
拿不准数据类型或要求字节级保真,无脑选字节流
比如通用文件工具、计算 MD5/SHA256、断点续传校验、解析自定义二进制协议——这些操作只关心“每个字节是否原样”,不关心它代表什么字符。字节流不假设、不转换、不丢弃,只忠实地搬运每一个 0 和 1。
- 字节流也能读文本,但你要自己 decode;字符流绝不能读二进制,否则必坏
- 不确定时选字节流,永远安全;选错字符流,可能毁掉一个文件
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











