标题是不言自明的。在很多 JRE javadocs 中,我到处都能看到短语“字节流”和“字符流”。
但它们不是一样的吗?还是它们在 Java 领域略有不同(例如解释不同)?提前致谢。
在 Java 中, abyte
与 a 不同char
。因此,字节流不同于字符流。字节用于任意二进制数据;字符专门用于表示字符串构建块的数据。
但如果 char 的宽度只有 1 个字节
除了它不是。
根据JLS §4.2.1 achar
是范围内的数字:
从
'\u0000'
到'\uffff'
包含,即从0到65535
但 abyte
是范围内的数字
从 -128 到 127(含)
字节流只是普通字节,就像在 HEX 编辑器中打开文件时看到的一样。
字符与普通字节不同。ASCII 编码每个字符恰好使用 1 个字节,但对于许多其他编码来说并非如此。例如,UTF-8 编码可以使用 1 到 4 个字节来编码单个字符。字符流旨在抽象出底层编码,并产生char
一种编码(在 Java 中,char
并String
使用 UTF-16 编码)。
根据经验:
在处理文本时,必须使用字符流将字节解码为具有适当编码的字符。
当您处理二进制数据或二进制和文本混合时,您必须使用字节流,否则它没有意义。如果一个字节序列以某种编码表示一个字符串,那么您总是可以挑选出这些字节并使用String(byte[] bytes, Charset charset)
构造函数来取回字符串。
它们是不同的。char
是 Java 中的 2 字节数据类型:byte
是 1 字节数据类型。
编辑:char
也是无符号类型,而byte
不是。
一般来说,最好根据它们的大小来谈论流,而不是它们携带的东西。字节流比字符流更直观,因为字符流使我们必须仔细检查 char 确实是一个字节,而不是 unicode char 或任何花哨的东西。
char 是一种表示形式,可以用一个字节表示,但一个字节总是一个字节。当字节不再是 8 位时,所有的世界都会被烧毁。