为什么Java I / O中的字节可以表示字符?

为什么Java I / O中的字节可以表示字符?

我看到这些字符只是ASCII。 然后它不是动态的,对吧?

这有什么解释吗?

字节流和字符流有什么区别?

字节不是字符。

在计算方面,“字符”是数字代码(或代码序列)与编码字符集的配对,其定义代码如何映射到真实世界字符(或空白或控制代码)。

只有与编码配对后,字节才能表示字符。 对于某些编码(如ASCII或ISO-8859-1),一个字节可以表示一个字符……并且许多编码甚至是ASCII兼容的(这意味着0到127的字符代码与ASCII的定义对齐)。但如果没有原始地图,你就不知道你拥有什么。

没有编码,字节只是8位整数。

你可以按照自己喜欢的方式解释它们,甚至可以获得一些可用的东西……但是如果不知道编码,你就不确定它们代表什么。

它甚至可能不是文本。

例如,考虑字节序列0x48 0x65 0x6c 0x6c 0x6f 0x2e 。 它可以解释为:

  • Hello. 采用ASCII和兼容的8位编码;
  • dinner用一些8位编码的dinner来certificate这一点;
  • 䡥汬漮 in big-endian UTF-16 * ;
  • 一个钢蓝色像素,后面是一个灰黄色的像素,RGB;
  • 以某种未知处理器的汇编语言load r101, [0x6c6c6f2e] ;

或者其他一百万件事。 仅这六个字节无法告诉您哪种解释是正确的。

至少使用文本,这就是编码的用途。

但是,如果您希望解释正确,则需要使用相同的编码来解码那些用于生成它们的字节。 这就是了解文本编码方式如此重要的原因。


字节流和字符流之间的区别在于字符流尝试使用字符而不是字节。 (它实际上适用于UTF-16代码单元。但是因为我们知道编码,这对于大多数用途来说已经足够了。)如果它包含在字节流中,则字符流使用编码来转换从基础字节流读取的字节to char s(或写入流到字节的字符)。

*注意:我不知道“䡥汬漮”是亵渎甚至是否有任何意义……但除非你把它编程为中文,否则电脑也不会。

字节可以表示一些字符,原因与int可以表示long相同。

字符是16位。 字节是8位。 此外,char是无符号的,字节是有符号的。

试着这样做:

 char c = 'a'; System.out.println(c); byte b = (byte)c; c = (char)b; System.out.println(c); 

这将输出:

 a a 

现在尝试用nDash替换’a’(unicode 2013)。 喜欢这个:

 char c = '–'; System.out.println(c); byte b = (byte)c; c = (char)b; System.out.println(c); 

这将输出:

 - 

在C和C ++中, char保存单个字节, char类型用于表示8位整数,以及单个字符的文本。 Java 不是那样的。

在Java中, charbyte是不同的数据类型。 char保存单个Unicode字符,该字符(通常)大于一个字节。 一个byte包含一个8位整数。 当您将char (或char[]String )转换为字节数组(类型byte[] )时,字符串将根据某些字符编码(通常为UTF-8)进行编码,结果就是该特定字符串的编码方式如果是根据该字符编码写入的,则存储在内存中(或磁盘上)。

Java IO支持直接从磁盘读取字节数组( byte[] ),因为这通常适用于二进制文件(即非文本文件,其中不应转换换行符,并且不应重新编码字符串) )。 该文件中的字节可能对应于8位编码中的字符(如ASCII或ISO8859- *),但如果您要以这种方式使用它们,则应该显式转换为char[]String )。

它是一个字节的原因是由于历史上的美国计算。 当基本的计算概念被发明时,内存,速度,存储都非常昂贵(而且很大 )。 设计非常简化,因此专注于北美英语世界(在某种程度上,仍然是)。

多个字节(如int)仅在外国(到美国)市场开放且计算机具有更多RAM和存储空间之后才添加。 世界使用复杂的写入系统,例如中文, 每个字符需要多个字节。 您可能来自世界上需要多字节字符的部分。 当我在北美学习编程时,我甚至需要考虑ASCII字节字节。 Java设计师大多来自北美。

例如,我的北美abcdefghijklmnopqrstuvwxyz标准中文字典是非常庞大的。