字节流与字符流
字节流和字符流是 Java IO 的两大核心体系,适用场景不同。
字节流
FileInputStream/FileOutputStream
Java
// 读取文件
try (FileInputStream fis = new FileInputStream("input.txt")) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
// 处理 buffer
}
}
// 写入文件
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
fos.write("Hello".getBytes());
}
适用场景
- 图片、视频、音频等二进制文件
- 不涉及编码转换的场景
- 网络传输数据
字符流
FileReader/FileWriter
Java
// 读取文本文件
try (FileReader fr = new FileReader("input.txt")) {
char[] buffer = new char[1024];
int len;
while ((len = fr.read(buffer)) != -1) {
// 处理字符
}
}
// 写入文本文件
try (FileWriter fw = new FileWriter("output.txt")) {
fw.write("Hello World");
}
InputStreamReader/OutputStreamWriter
指定编码的字符流:
Java
// 指定编码读取
try (InputStreamReader isr = new InputStreamReader(
new FileInputStream("input.txt"), "UTF-8")) {
// 读取 UTF-8 编码文件
}
// 指定编码写入
try (OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("output.txt"), "UTF-8")) {
osw.write("内容");
}
字节流 vs 字符流
| 特性 | 字节流 | 字符流 |
|---|---|---|
| 处理单位 | byte(8位) | char(16位) |
| 适用数据 | 二进制数据 | 文本数据 |
| 编码处理 | 不处理 | 自动编码转换 |
| 基类 | InputStream/OutputStream | Reader/Writer |
| 文件复制 | ✅ 推荐 | ❌ 可能破坏编码 |
注意:文本文件复制可以用字节流或字符流,但二进制文件(图片、视频)必须用字节流。
文件复制示例
字节流复制(推荐)
Java
try (FileInputStream fis = new FileInputStream("source.jpg");
FileOutputStream fos = new FileOutputStream("target.jpg")) {
byte[] buffer = new byte[8192];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
}
字符流复制(仅文本文件)
Java
try (FileReader fr = new FileReader("source.txt");
FileWriter fw = new FileWriter("target.txt")) {
char[] buffer = new char[1024];
int len;
while ((len = fr.read(buffer)) != -1) {
fw.write(buffer, 0, len);
}
}
要点总结
- 字节流处理二进制数据,字符流处理文本数据
- 字符流自动处理编码转换,字节流不处理
- FileReader/FileWriter 使用默认编码, InputStreamReader/OutputStreamWriter 可指定编码
- 二进制文件必须用字节流,文本文件两者均可
- 文件复制推荐使用字节流
📝 发现内容有误?点击此处直接编辑