每字节读取输入流如何工作?

时间:2019-09-24 17:01:46

标签: java inputstream

我不明白System.in.read()方法的工作原理。

有这样的代码:

    public static void main(String[] args) throws IOException {
        while (true){
            Integer x = System.in.read();
            System.out.println(Integer.toString(x, 2));
        }

我知道System.in.read()方法是从输入流PER BYTE读取的。

因此,当我输入'A'(U + 0041,一个字节用于存储char)时-程序输出为:

 1000001 (U+0041)
 1010 (NL) - it works as expected.

但是当我输入'Я'(U + 042F,两个字节用于存储char)时,输出为:

 11010000 (byte1)
 10101111 (byte2)
 1010 (byte3 - NL)

字母'Я'(U + 042F)的真实代码是10000101111。

为什么11010000 10101111(byte1 + byte2)不是字母'Я'(U + 042F)的二进制代码?

1 个答案:

答案 0 :(得分:2)

这取决于将数据发送到System.in的外部进程。它可以是命令外壳,IDE或其他进程。

在命令外壳程序的典型情况下,外壳程序将配置字符编码。 (在Windows上为chcp,在Linux上为locale charmap。)

字符编码确定如何将图形字符或字形编码为数字。例如,Windows计算机可能使用"Windows-1251"的“代码页”,并将“Я”编码为一个字节(0xCF)。或者,它可以使用UTF-8并将“Я”编码为两个字节(0xD0 0xAF),也可以使用UTF-16并使用两个不同的字节(0x04 0x2F)。

您的结果表明,向Java程序发送数据的过程正在使用UTF-8作为编码。