选对流取决于数据本质:二进制文件(图片、pdf等)必须用字节流(fileinputstream/outputstream),搭配buffered流提升性能;文本文件(txt、json等)优先用字符流(inputstreamreader+bufferedreader),指定utf-8编码防乱码;跨类型协作时用inputstreamreader/outputstreamwriter做安全转换;不确定时默认选字节流,确保字节级无损。

选对流,关键看数据本质:是原始字节,还是人类可读的文本。
处理二进制文件必须用字节流
图片、PDF、音频、视频、ZIP、序列化对象(.ser)、可执行文件(.exe)等,内部没有“字符”概念,每个字节都承载特定结构含义。一旦用字符流读写,编码转换会篡改字节顺序或值,导致文件损坏——比如图片打不开、压缩包校验失败、反序列化报错。
- 核心类:FileInputStream / FileOutputStream
- 务必搭配缓冲流提升性能:BufferedInputStream / BufferedOutputStream
- 适用场景:文件拷贝、网络响应体下载、ObjectInputStream/ObjectOutputStream、加解密输入输出
读写文本文件优先用字符流
txt、json、xml、csv、properties、java源码等,内容面向人阅读,含中文、换行、标点等 Unicode 字符。字符流自动按指定编码(如 UTF-8)完成字节 ↔ 字符转换,避免手动 new String(byte[], "UTF-8") 的易错操作,也支持按行读取(readLine)、跳过 BOM 等文本友好功能。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不推荐直接用 FileReader/FileWriter:它们默认使用系统编码,跨环境极易乱码
- 稳妥写法:InputStreamReader + FileInputStream(指定 StandardCharsets.UTF_8) + BufferedReader
- 适用场景:配置加载、日志解析、CSV 行迭代、HTML 内容提取
需要跨类型协作时用转换流
实际开发中常遇到“底层是字节流,但内容是文本”的情况:比如从 SocketInputStream、ZipInputStream、HttpURLConnection.getInputStream() 中读取 JSON 响应。这时不能硬套 FileReader,而要用转换流做安全桥接。
- InputStreamReader:把任意 InputStream 转成 Reader,显式传入 Charset
- OutputStreamWriter:把 Writer 转成 OutputStream,同样支持编码控制
- 这是解决“字节流读出乱码”的标准方案,不是靠 guess 编码或反复试错
不确定时,默认选字节流
如果你不清楚数据来源或格式,或者目标是无损复制、校验、加密等字节级保真操作,字节流永远是最安全的选择。它不假设、不转换、不丢弃——只忠实地搬运每一个 0 和 1。
- 适合通用工具类:如文件哈希计算(MD5/SHA256)、断点续传校验、二进制协议解析
- 注意:字节流也能读文本,但需你自行 decode;字符流绝不能读二进制,否则不可逆损坏
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










