为什么write()控制台输出返回一个字符

时间:2018-08-14 16:39:08

标签: java

与Java中的低级方法write()进行了混合,并遇到了这段令人困惑的代码。

int b;

b = 'X';
System.out.write(b);

该方法的一般记录格式为void write(int byteval)

我知道可以通过自动类型转换来分配字节和整数,但是尽管write()被声明为int却为什么仍输出字符?我知道它不常用,但仍然很好奇为什么只写低阶8位来允许它。

2 个答案:

答案 0 :(得分:1)

查看ASCII表。请注意,将char传递到int会根据ASCII表进行转换。 char的范围在0到65535之间。字符'X'被转换为88的整数。所以:

int b = 'X';
System.out.println(b); // 88

方法System.out::write与上面的代码段System.out::println有点不同,因为它接受int作为参数并根据ASCII表打印其值。它的文档说:

  

将指定的字节写入此流。如果该字节为换行符并且启用了自动刷新,则将调用flush方法。

     

请注意,字节是按给定方式写入的;要编写将根据平台的默认字符编码进行翻译的字符,请使用print(char)或println(char)方法。

答案 1 :(得分:0)

重要的是要认识到所有演员及其角色

Java:PrintStream.write(int)“按给定字节写入”。在这种情况下,它将写入System.out流。 “通常,此流对应于显示输出或由主机环境或用户指定的另一个输出目标。”

目前没有字符编码(因此没有文本)。

如果您已经与用户达成协议,他们应该将程序的输出解释为文本,那么您还必须已经同意字符编码。通常,写入输出流的程序在终端(又称为控制台)中运行。对于用户,在机器上的任何时间点,终端都配置为使用特定的字符编码。 (Linux locale; Windows chcp。)[很多人忽略了此步骤,因为对于大多数常见的西方字符,字符编码之间有很多相似之处。]

将程序输出“管道”(也称为重定向)到文件或另一个程序的输入流中也很常见。输出的格式和目的仍然必须达成协议。许多文本编辑器在将文件作为文本打开时会以字符编码“检测”(猜测)并经常将其显示给用户。由用户决定是否让文本编辑器使用正确的字符编码。

在许多可能性中,文本编辑器可以“检测”最小和/或最可能的字符编码。这通常会使认为文本编辑器告诉他们字符编码是用户而不是相反的用户感到困惑。有时,猜测足以读取文件的当前内容。但是,如果用户使用错误的字符编码添加新字符,那么程序作者的期望就会被破坏。

总结演员及其角色是:

  • 程序和库:写入字节(至少在您编写的代码中)
  • 程序作者:传达输出的意图和格式,尤其是字符编码(如果适用)
  • 用户:将终端或下游程序配置为使用相同的字符编码
  • 用户:如果输入错误,请更正文本编辑器的猜测编码