张老师提出的问题解答 关于IO

Java IO怪现象解析
本文通过一个简单的Java程序,探讨了在读取键盘输入时,直接按下回车键导致输出结果异常的现象及其原因。解释了如何在命令行窗口中观察到这种现象,并从编码方式的角度进行了进一步的分析。

以下是一个关于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控制台可能读的是按一个字节来读的,我想讨论一下系统按什么样的编码来读这个语句会更有用一些。

 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值