在 Java 中,IO(输入输出)操作 是指对数据的读写操作,通常涉及文件、网络、控制台等。Java 提供了丰富的 IO 类和接口,主要分为两大类:字节流 和 字符流。它们的主要区别如下:
1. 字节流(Byte Stream)
字节流用于处理 原始二进制数据,通常适合于处理所有类型的文件,包括文本文件、图片、音频、视频等。它直接操作 字节(8 位),不考虑字符编码。
常用的字节流类:
-
InputStream:所有字节输入流的超类,负责读取字节数据。
- 常见子类:
FileInputStream
,BufferedInputStream
,ByteArrayInputStream
- 常见子类:
-
OutputStream:所有字节输出流的超类,负责写入字节数据。
- 常见子类:
FileOutputStream
,BufferedOutputStream
,ByteArrayOutputStream
- 常见子类:
适用场景:
- 适合处理 非文本 文件,比如图片、音频、视频等。
- 处理 二进制文件 时,直接使用字节流效率更高,因为它不会考虑字符编码的问题。
示例代码:
FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt");
int data;
while ((data = fis.read()) != -1) { // 按字节读取
fos.write(data); // 按字节写入
}
fis.close();
fos.close();
2. 字符流(Character Stream)
字符流用于处理 文本数据,它专门为处理字符而设计,通常适用于 文本文件。字符流依赖于字符编码(如 UTF-8, UTF-16 等)来将字节转换为字符,或者将字符转换为字节。
常用的字符流类:
-
Reader:所有字符输入流的超类,负责读取字符数据。
- 常见子类:
FileReader
,BufferedReader
,InputStreamReader
- 常见子类:
-
Writer:所有字符输出流的超类,负责写入字符数据。
- 常见子类:
FileWriter
,BufferedWriter
,OutputStreamWriter
- 常见子类:
适用场景:
- 适合处理 文本文件,因为它能正确处理不同字符集的编码和解码。
- 当处理字符串或文本时,使用字符流更方便,避免了手动处理字节到字符的转换。
示例代码:
FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt");
int data;
while ((data = fr.read()) != -1) { // 按字符读取
fw.write(data); // 按字符写入
}
fr.close();
fw.close();
3. 字节流与字符流的区别
特性 | 字节流(Byte Stream) | 字符流(Character Stream) |
---|---|---|
数据单位 | 以字节(byte, 8 位)为单位 | 以字符(char, 16 位)为单位 |
处理对象 | 处理所有类型的文件,包括文本和二进制文件 | 专门用于处理文本数据 |
编码问题 | 不考虑字符编码,直接读写二进制数据 | 需要处理字符编码和解码 |
常用基类 | InputStream 和 OutputStream |
Reader 和 Writer |
适用场景 | 处理图片、音频、视频等二进制文件 | 处理文本文件,如 .txt , .csv 等 |
4. 两者的关系
尽管字节流和字符流处理的数据单位不同,但字符流本质上是基于字节流实现的。字符流是对字节流的封装,它通过字符编码(如 UTF-8)将字节转换为字符或将字符转换为字节。因此,在实际使用中,字符流依赖于字节流。
字符流与字节流的桥梁:
-
InputStreamReader
和OutputStreamWriter
是字符流和字节流之间的桥梁,它们将字节流转换为字符流,或者将字符流转换为字节流。InputStreamReader
:将InputStream
转换为Reader
,即字节流转换为字符流。OutputStreamWriter
:将OutputStream
转换为Writer
,即字符流转换为字节流。
示例代码(使用转换流):
InputStream inputStream = new FileInputStream("input.txt");
Reader reader = new InputStreamReader(inputStream, "UTF-8"); // 将字节流转换为字符流
OutputStream outputStream = new FileOutputStream("output.txt");
Writer writer = new OutputStreamWriter(outputStream, "UTF-8"); // 将字符流转换为字节流
总结:
- 字节流 处理二进制数据,适合图片、视频、音频等文件的操作。
- 字符流 处理文本数据,专门为字符操作设计,能正确处理字符编码。
- 字符流本质上是对字节流的封装,依赖于字节流的底层操作,并通过字符编码实现字节到字符的转换。
在选择使用字节流还是字符流时,通常基于数据的类型来决定:如果是文本数据,优先选择字符流;如果是二进制数据或不需要考虑编码的情况,使用字节流更合适。
标签:编码,Java,字节,字符,处理,基础,IO,new,转换 From: https://www.cnblogs.com/DCFV/p/18438034