Java 中字符流与字节流的区别

2025年6月16日 | 阅读 5 分钟

在 Java 中,流用于输入和输出操作,允许数据从源读取或写入目标。

Java 提供两种类型的流

  1. 字符流
  2. 字节流

这些流在处理数据和它们所包含的数据类型方面可能有所不同。

1. 字符流

字符流旨在处理基于字符的记录,包括包含字母、数字、符号和其他字符的文本记录。这些流通过名称以“Reader”或“Writer”结尾的类来表示,例如 FileReader、BufferedReader、FileWriter 和 BufferedWriter。

字符流提供了一种方便的方式来读取和写入基于文本的数据,因为它们会自动处理字符编码和解码。它们使用特定的字符编码(如 UTF-8 或 ASCII)将原始数据转换为底层字节流并从底层字节流转换回来。这使得字符流非常适合处理文本文件、读写字符串以及处理人类可读的数据。

字符流示例

示例

编译并运行

输出

The characters read from the reader: H,e,l,l,o,

2. 字节流

字节流旨在处理原始二进制数据,包括所有类型的数据,如字符、图像、音频和视频。这些流通过名称以“InputStream”或“OutputStream”结尾的类来表示,例如 FileInputStream、BufferedInputStream、FileOutputStream 和 BufferedOutputStream。

字节流为读取和写入字节或字节块提供了一个低级接口。它们通常用于处理非文本数据、以二进制形式读取和写入文件以及处理网络套接字。字节流不执行任何字符编码或解码。它们将数据视为字节序列,而不将其解释为字符。

字节流示例

示例

编译并运行

输出

The bytes read from the input stream:
10,20,30,40,

字符流与字节流

方面字符流字节流
数据处理它处理基于字符的数据。它处理原始二进制数据。
表示类名以“Reader”或“Writer”结尾。类名以“InputStream”或“OutputStream”结尾。
适用于它适用于文本数据、字符串和人类可读的信息。它最适合处理非文本数据、二进制文件和多媒体。
字符编码字符流执行自动编码和解码。字节流不执行编码或解码。
文本与非文本数据基于文本的数据,字符串。二进制数据、图像、音频和视频。
性能额外的转换可能会影响性能。处理大型二进制数据效率高。
处理大型文本文件由于编码,它可能会影响性能。高效,没有编码开销。
字符串操作它方便进行字符串操作。它并非专门为字符串操作而设计。
便捷方法文本数据的高级抽象。字节数据的低级接口。
逐行读取它是读取行的便捷方法。它是面向字节的,没有内置的行读取方法。
文件处理读/写文本文件。读/写二进制文件。
网络通信发送/接收文本数据。发送/接收二进制数据。
处理图像/音频/视频不适合直接处理二进制数据适合处理二进制多媒体数据
文本编码它支持各种字符编码。没有特定的文本编码支持。
缓冲类它使用 BufferedReader、BufferedWriter 类。它使用 BufferedInputStream、BufferedOutputStream 类。
数据单元大小每字符 2 字节(Java 中为 UTF-16)。每单元 1 字节。
流转换它可以使用 InputStreamReader 从字节流进行转换。转换为字符流的基础。
在序列化中的用例不适合对象序列化。对象序列化首选(ObjectOutputStream)。
Unicode 支持它完全支持 Unicode 字符。它本身不直接支持 Unicode。
典型用例读取 .txt、.csv 文件读取 .jpg、.mp3、.pdf 文件
错误处理可能会引发编码/解码异常编码相关问题较少。

字符流与字节流选择题

1. Java 中的字节流和字符流有什么主要区别?

  1. 字节流处理文本数据,而字符流处理多媒体数据。
  2. 字节流处理原始二进制数据,而字符流处理基于字符的文本数据。
  3. 对于所有类型的数据,字符流都比字节流快。
  4. 字节流会自动解码字符。
 

答案:B

解释:字节流处理原始二进制内容(图像、文件等),而字符流用于人类可读的文本并自动处理编码。


2. 下列关于字符流的说法,哪个是错误的?

  1. 它们支持自动字符编码和解码。
  2. 它们由以 Reader 或 Writer 结尾的类表示。
  3. 它们最适合读取图像和视频。
  4. 它们对于处理文本文件很有用。
 

答案:C

解释:字符流用于文本数据。图像和视频应使用字节流进行处理。


3. 在处理大型二进制文件时,哪种流类型通常更有效?

  1. 字符流
  2. 字节流
  3. 两者效率相当
  4. 两者都无法处理二进制文件
 

答案:B

解释:字节流不执行字符编码或解码,因此在处理音频或视频文件等二进制数据时效率更高。


4. 哪种流类型允许您使用 readLine() 方法逐行读取数据?

  1. 字节流
  2. InputStream
  3. 字符流 (BufferedReader)
  4. OutputStream
 

答案:C

解释:BufferedReader 提供了 readLine() 方法来逐行读取文本数据,这在字节流中不可用。


5. 下列哪种字符编码是字符流自动处理的?

  1. ASCII
  2. UTF-8
  3. UTF-16
  4. 以上全部。
 

答案:D

解释:字符流会自动处理字符编码和解码,使用 ASCII、UTF-8 和 UTF-16 等编码,具体取决于系统或明确提供的编码。


6. 下列哪句话最能描述 Java 中的字节流?

  1. 它们将字节解释为字符。
  2. 它们使用 Unicode 进行字符转换。
  3. 它们处理原始二进制数据,不进行字符解码。
  4. 它们仅用于文本文件。
 

答案:C

解释:字节流在不解释或将其转换为字符的情况下读取和写入原始字节,这使其适用于图像和音频等二进制数据。