Java 程序员为什么在System.in.read()中使用字符呢?

Java 程序员为什么在System.in.read()中使用字符呢?,java,escaping,system.in,Java,Escaping,System.in,我注意到下面这行代码存在很多。(例如,在本网站上。) 现在来测试特定字符的击键、ASCII值或转义序列等 if (ch == 'a' || ch == 65 || ch == '\n' || ch == 13) System.out.print("true"); 使用上面的字符比下面使用int的代码行有什么好处吗 int i = System.in.read(); // uses an int, which requires no cast. int变量“i”可以在前面所示的相同if语句中

我注意到下面这行代码存在很多。(例如,在本网站上。)

现在来测试特定字符的击键、ASCII值或转义序列等

if (ch == 'a' || ch == 65 || ch == '\n' || ch == 13) System.out.print("true");
使用上面的字符比下面使用int的代码行有什么好处吗

int i = System.in.read();  // uses an int, which requires no cast.

int变量“i”可以在前面所示的相同if语句中使用。

完全没有理由强制转换。这很好

int i = System.in.read();
if(i == 'a'){
   // do something
}
您可以这样做,因为
'a'
是一个int范围内的值


另外,请注意,在读取文件等时,直接对字符进行强制转换可能会有问题,因为
InputStream.read()
所做的是读取
字节,而不是
char
。字符有两个字节宽。

完全没有理由强制转换。这很好

int i = System.in.read();
if(i == 'a'){
   // do something
}
您可以这样做,因为
'a'
是一个int范围内的值


另外,请注意,在读取文件等时,直接对字符进行强制转换可能会有问题,因为
InputStream.read()
所做的是读取
字节,而不是
char
。字符有两个字节宽。

两种方法都不正确。从
系统中读取字符的正确方法是使用(或,如果提供了正确的功能)。原因是
InputStream.read()
读取的是单个字节,而不是字符,有些字符需要读取多个字节。还可以指定将字节转换为字符时要使用的字符编码

Reader rdr = new InputStreamReader(System.in);
int i = rdr.next();
if (i == -1) {
    // end of input
} else {
    // normal processing; safe to cast i to char if convenient
}

这两种方法都不正确。从
系统中读取字符的正确方法是使用(或,如果提供了正确的功能)。原因是
InputStream.read()
读取的是单个字节,而不是字符,有些字符需要读取多个字节。还可以指定将字节转换为字符时要使用的字符编码

Reader rdr = new InputStreamReader(System.in);
int i = rdr.next();
if (i == -1) {
    // end of input
} else {
    // normal processing; safe to cast i to char if convenient
}

老实说,答案可能和可读性一样简单。其目的是将其用作字符,因此程序员将其转换为字符。老实说,答案可能与可读性一样简单。其目的是将其用作字符,因此程序员将其转换为字符请解释为什么变量“rdr”是Reader类型,而不是InputStreamReader类型?具体来说,请您解释一下这项服务的好处。谢谢。另外,在您的代码示例中,当您使用next()方法时,您是指read()?@user2911290-在这种情况下没有特别的好处。这只是习惯;我通常编程到一个接口,除非我需要一个更具体类型的特定功能。它使代码的未来演化更容易。(例如,我可以切换到
CharArrayReader
PipedReader
,而不用担心是否依赖于特定于方法或行为的
InputStreamReader
)关于示例代码中的第一行:
Reader rdr=new InputStreamReader(System.in)请解释为什么变量“rdr”是Reader类型,而不是InputStreamReader类型?具体来说,请您解释一下这项服务的好处。谢谢。另外,在您的代码示例中,当您使用next()方法时,您是指read()?@user2911290-在这种情况下没有特别的好处。这只是习惯;我通常编程到一个接口,除非我需要一个更具体类型的特定功能。它使代码的未来演化更容易。(例如,我可以切换到
CharArrayReader
PipedReader
,而不用担心是否依赖于特定于方法或行为的
InputStreamReader