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 设计时为了明确分工、提升效率:
处理 原始数据 时(比如图片、视频、网络流量),你不关心字符编码,那就直接用 字节流。
处理 文本数据 时(需要考虑编码格式),就应该用 字符流,避免乱码。
🧠 五、如何选?
简单口诀:
读写“文本”用字符流,
其他(图片/文件/网络)用字节流!