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

Java 为什么write()控制台输出返回一个字符,java,Java,在java中处理低级方法write()时,遇到了这段令人困惑的代码 int b; b = 'X'; System.out.write(b); 一般文档形式的方法是voidwrite(int byteval) 我知道自动类型转换可以分配字节和int,但是为什么write()尽管声明了int,但仍然输出字符?我知道它不常用,但仍然很好奇为什么只有低阶8位才允许使用它。看看表。请注意,将char传递到int会根据ASCII表进行转换。char的范围在0到65535之间。字符'X'被转换为88的整数

在java中处理低级方法write()时,遇到了这段令人困惑的代码

int b;

b = 'X';
System.out.write(b);
一般文档形式的方法是
voidwrite(int byteval)

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

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

int b = 'X';
System.out.println(b); // 88
该方法的工作原理与上面代码片段中的
System.out::println
稍有不同,因为它接受
int
作为参数,并根据ASCII表打印其值。它的文件说:

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

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


认识所有参与者及其角色非常重要

Java:“字节按给定方式写入”。在本例中,它写入流。“通常,此流对应于主机环境或用户指定的显示输出或其他输出目标。”

此时没有字符编码(因此也没有文本)

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

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

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

总结参与者及其角色如下:

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

我们只能猜测为什么该方法最初是用
int
而不是
byte
参数定义的。一个原因可能是
byte
参数需要大量类型转换,例如,必须使用
os.write((byte)0)
来写入零字节。Java不使用ASCII。请参阅Java文档中引用的和。