[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 位)为单位
处理对象 处理所有类型的文件,包括文本和二进制文件 专门用于处理文本数据
编码问题 不考虑字符编码,直接读写二进制数据 需要处理字符编码和解码
常用基类 InputStreamOutputStream ReaderWriter
适用场景 处理图片、音频、视频等二进制文件 处理文本文件,如 .txt, .csv

4. 两者的关系#

尽管字节流和字符流处理的数据单位不同,但字符流本质上是基于字节流实现的。字符流是对字节流的封装,它通过字符编码(如 UTF-8)将字节转换为字符或将字符转换为字节。因此,在实际使用中,字符流依赖于字节流。

字符流与字节流的桥梁:#

  • InputStreamReaderOutputStreamWriter 是字符流和字节流之间的桥梁,它们将字节流转换为字符流,或者将字符流转换为字节流。

    • 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");  // 将字符流转换为字节流

总结:#

  • 字节流 处理二进制数据,适合图片、视频、音频等文件的操作。
  • 字符流 处理文本数据,专门为字符操作设计,能正确处理字符编码。
  • 字符流本质上是对字节流的封装,依赖于字节流的底层操作,并通过字符编码实现字节到字符的转换。

在选择使用字节流还是字符流时,通常基于数据的类型来决定:如果是文本数据,优先选择字符流;如果是二进制数据或不需要考虑编码的情况,使用字节流更合适。

作者:Esofar

出处:https://www.cnblogs.com/DCFV/p/18438034

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Duancf  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示