[Java基础]IO
在 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基础
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具