Java - 字节流和字符流之间有什么区别?

16
标题已经很明确了。在许多JRE javadocs中,我看到“字节流”和“字符流”这些短语无处不在。 但它们不是一样的吗?或者它们在Java世界中略有不同(例如,解释方式不同)?提前致谢。
4个回答

25
在Java中,bytechar不是同一件事。因此,字节流与字符流不同。字节用于任意二进制数据;而字符专门用于表示字符串的构建块的数据。

但是如果一个char只有1个字节宽度

除了它并不是。根据JLS §4.2.1char是一个范围内的数字:

'\u0000''\uffff',即从0到65535

但是byte是一个范围内的数字:

从-128到127(含)


1
感谢@Matt Ball-我理解它们在类型上是不同的(bytechar等),但如果一个char只有1个字节的宽度,那么将输入流存储为字节数组与字符数组有什么不同?这就是我的问题所在。 - IAmYourFaja
4
谁说char类型只有1字节宽度?http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html - Matt Ball

8

字节流就是纯粹的字节,就像你在HEX编辑器中打开文件时看到的一样。

字符与纯字节不同。ASCII编码每个字符正好使用1个字节,但对于许多其他编码来说并非如此。例如,UTF-8编码可以使用1到4个字节来编码单个字符。字符流被设计为抽象出底层编码,并生成某种编码的char字符(在Java中,charString使用UTF-16编码)。

作为经验法则:

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

  • 当您处理二进制数据或混合二进制和文本时,必须使用字节流,因为否则没有意义。如果一系列字节表示某种编码中的字符串,则始终可以选择这些字节并使用String(byte[] bytes, Charset charset)构造函数以获取字符串。


5

它们是不同的。在Java中,char是一个2字节的数据类型:byte是一个1字节的数据类型。

编辑: char也是一种无符号类型,而byte则不是。


0
通常来说,更好的做法是根据流的大小而不是它们所携带的内容来谈论流。字节流比字符流更直观,因为字符流会让我们不得不仔细检查一个字符是否确实是一个字节,而不是一个Unicode字符或其他花哨的东西。
字符是一种表示形式,可以用一个字节来表示,但字节始终是一个字节。当字节不再是8位时,整个世界都将燃烧。

当字节不再是8位时,整个世界都将燃烧。——并非如此。http://en.wikipedia.org/wiki/Byte#History - Matt Ball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接