Java中字节流和字符流的区别、使用场景区分、一文详解。
Java 中的 字节流(Byte Stream) 和 字符流(Character Stream) 是两种最基础的 I/O(输入输出)处理方式,
它们各有用途,理解它们对写好文件处理、网络传输、系统交互等代码非常关键。
🧱 一、核心区别
| 对比点 | 字节流(Byte Stream) | 字符流(Character Stream) |
|---|---|---|
| 基类 | InputStream / OutputStream |
Reader / Writer |
| 处理单位 | 8位字节(byte) | 16位字符(char,支持 Unicode) |
| 操作对象 | 任意数据(图片、音频、视频、压缩包等) | 文本文件(支持各种字符编码) |
| 是否处理编码 | 不处理字符编码,原样读写 | 自动进行字符集转换(如 UTF-8 转 Unicode) |
| 性能(相对) | 更快,适合原始数据 | 稍慢,适合文本处理 |
📦 二、使用场景总结
| 场景 | 推荐使用流类型 | 示例类 |
|---|---|---|
| 读取图片、音频、视频 | 字节流 | FileInputStream |
| 写入 PDF、ZIP 文件 | 字节流 | FileOutputStream |
读写 .txt 文本文件 |
字符流 | FileReader / FileWriter |
| 控制台输出字符 | 字符流 | PrintWriter, BufferedWriter |
| 网络传输字节 | 字节流 | Socket.getInputStream() |
| 处理网页文本内容 | 字符流(配合编码) | InputStreamReader + BufferedReader |
🧪 三、代码示例对比
1. 字节流读取文件(适合二进制文件)
import java.io.FileInputStream; import java.io.IOException; public class ByteStreamExample { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("example.jpg"); int b; while ((b = fis.read()) != -1) { System.out.print(b + " "); } fis.close(); } }
2. 字符流读取文件(适合文本文件)
import java.io.FileReader; import java.io.IOException; public class CharStreamExample { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("example.txt"); int c; while ((c = fr.read()) != -1) { System.out.print((char)c); } fr.close(); } }
🎯 四、为什么要区分这两种流?
Java 设计时为了明确分工、提升效率:
-
处理 原始数据 时(比如图片、视频、网络流量),你不关心字符编码,那就直接用 字节流。
-
处理 文本数据 时(需要考虑编码格式),就应该用 字符流,避免乱码。
🧠 五、如何选?
简单口诀:
读写“文本”用字符流,
其他(图片/文件/网络)用字节流!

浙公网安备 33010602011771号