Java - 字节流与字符流?

2022-09-03 09:39:07

标题非常不言自明。在很多JRE javadocs中,我看到到处都是短语“字节流”和“字符流”。

但它们不是一回事吗?还是在Java-land中它们略有不同(例如,解释不同)?提前致谢。


答案 1

在 Java 中,a 与 .因此,字节流不同于字符流。字节用于任意二进制数据;字符专门用于表示字符串构建基块的数据。bytechar

但是如果字符的宽度只有 1 个字节

但事实并非如此。根据 JLS §4.2.1 a 是该范围内的一个数字:char

从到(含),即从 0 到 65535'\u0000''\uffff'

但 a 是范围内的数字byte

从 -128 到 127(含)


答案 2

字节流只是纯字节,就像您在十六进制编辑器中打开文件时所看到的那样。

字符不同于纯字节。ASCII 编码每个字符正好使用 1 个字节,但对于许多其他编码则不然。例如,UTF-8 编码可以使用 1 到 4 个字节来编码单个字符。字符流旨在抽象出底层编码,并产生一种类型的编码(在Java中,并使用UTF-16编码)。charcharString

根据经验:

  • 处理文本时,必须使用字符流将字节解码为具有适当编码的字符。

  • 当您处理二进制数据或二进制和文本的混合时,必须使用字节流,否则它没有意义。如果一个字节序列表示某种编码中的字符串,那么你总是可以挑选出这些字节,并使用 String(byte[] bytes, Charset charset) 构造函数来取回 String。