以下是一个关于IO的怪问题,问题是这样的:读取键盘输入的一个字符,然后打印输出这个字符,在打印字符的前面和后面分别加了一个字符串,程序的代码如下:
public class Test
{
public static void main(String [] args) throws Exception
{
System.out.print("Input a char:");
char ch = (char)System.in.read();
System.out.println("hello" + ch + "AB");
}
}
编译并运行这个程序。
(1)输入字符“a”,命令行窗口打印输出的结果如图1所示,与我们预期的一样。
图1
(2)重新运行这个程序,直接按下回车键,在命令行窗口打印输出的结果如图2所示。这时,打印输出的结果是:打印语句中字符后面的字符串“替换”了字符前面的字符串中的部分字符,即打印输出字符串“ABllo”。
图2
请大家都来想一想,为什么在输入普通字符时,输出的结果是正常的;而直接按下回车键,后面的字符串就“替换”了前面的字符串,并且没有输出回车换行符呢?
解答
1 读取键盘输入的一个字符时,我们在键盘上按一下回车键,实际上读取到的是两个字符,即“/r”和“/n”。字符“/r”表示回车,即光标回到当前行的行首而不换行;字符“/n”表示换行,即光标移到当前行的下一行行首。
按一下回车键,System.in.read()读取到字符“/r”,当执行到下面的程序代码时:
System.out.println("hello" + ch + "AB");
打印字符串“hello”后,接着打印输出字符“/r”,这时,光标移到字符串“hello”所在当前行的行首,由于没有字符“/n”,不会换到下一行,再继续打印字符串“AB”。这样,字符串“AB”就覆盖了字符串“hello”的前两个字符,所以,我们看到在命令行打印输出的是字符串“ABllo”。
2 在Eclipse下,没有发现这种问题,我觉得这个是编码方案造成的,Eclipse下运行估记是按Unicode编码来读的两个字节,而MS控制台可能读的是按一个字节来读的,我想讨论一下系统按什么样的编码来读这个语句会更有用一些。
Java IO怪现象解析
本文通过一个简单的Java程序,探讨了在读取键盘输入时,直接按下回车键导致输出结果异常的现象及其原因。解释了如何在命令行窗口中观察到这种现象,并从编码方式的角度进行了进一步的分析。
171万+

被折叠的 条评论
为什么被折叠?



