处理二进制文件(如图片、pdf)必须用字节流(fileinputstream/outputstream),避免编码篡改;文本文件(如txt、json)优先用字符流(inputstreamreader+bufferedreader)并显式指定utf-8编码;转换流(inputstreamreader/outputstreamwriter)用于字节与字符间安全转换。

选对流类型,关键看数据本质:是原始字节,还是人类可读的文本。
处理图片、音频、PDF 等二进制文件 → 用字节流
这类文件没有“字符”概念,每个字节都承载特定含义。一旦用字符流读写,编码转换会篡改原始字节,导致文件损坏(比如图片打不开、压缩包解压失败)。
- 核心类:FileInputStream / FileOutputStream
- 推荐搭配缓冲流:BufferedInputStream / BufferedOutputStream,提升效率
- 示例场景:文件拷贝、网络下载、对象序列化(ObjectOutputStream)、加密解密
读写 .txt、.json、.xml、.csv 等文本文件 → 优先用字符流
字符流内置编解码逻辑,能自动按指定字符集(如 UTF-8)把字节转成字符,避免手动处理乱码。它还提供更符合文本习惯的操作,比如按行读取。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 核心类:FileReader / FileWriter(但注意:默认用系统编码,不推荐直接用)
- 更稳妥写法:用 InputStreamReader + FileInputStream 指定 Charset,再套 BufferedReader
- 示例场景:配置文件解析、日志读取、CSV 数据导入、HTML 内容提取
需要跨类型协作时 → 用转换流衔接
不是非此即彼。实际中常需把字节流“翻译”成字符流,比如从网络 Socket 或 ZIP 输入流里读文本内容。
- InputStreamReader:把 InputStream 转为 Reader,可传入 StandardCharsets.UTF_8 显式指定编码
- OutputStreamWriter:把 Writer 转为 OutputStream,同样支持编码控制
- 这是解决“字节流读出乱码”问题的标准解法,而不是强行用 new String(byte[])
别被类名带偏,重点看数据流向和单位
FileReader 看似“文件专用”,但它仍是字符流,只适合文本;FileInputStream 名字朴素,却是处理一切二进制数据的起点。记住两个锚点:
- 输入流(Input/Reader):数据流向内存 → 读操作
- 输出流(Output/Writer):数据流出内存 → 写操作
- 单位是字节(byte)还是字符(char),决定了它能不能安全处理中文、换行、特殊符号
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










