日期:2014-05-20  浏览次数:20688 次

请教:这段程序是先接受全部输入再逐个判断,还是按照输入顺序逐个判断?以及为什么?谢谢!
public   class   ReadLine   {

public   static   void   main(String[]   args)   {
//   TODO   Auto-generated   method   stub
byte   buf[]   =   new   byte[1024];
String   strInfo   =   null;
int   pos   =   0;
int   ch   =   0;
System.out.println( "enter   info,input   bye   for   exit: ");
while   (true)   {
try   {
ch   =   System.in.read();
}   catch   (Exception   e)   {
System.out.println(e.getMessage());
}
switch   (ch)   {
case   '\r ':
break;
case   '\n ':
strInfo   =   new   String(buf,   0,   pos);
if   ( "bye ".equalsIgnoreCase(strInfo))
return;
else
System.out.println(strInfo);
pos   =   0;
break;
default:
buf[pos++]   =   (byte)   ch;
}
}
}

}


------解决方案--------------------
这是Java的IO流问题, 你可以这样来理解你的程序:

调用System.in.read();的时候, 由于输入流并没有数据可以读取, 所以read()方法将会阻塞. 这时候控制台在等待你的输入, 而你的输入是以回车键来提交的.

当你按下回车键的时候, 也就激活了刚才阻塞的read()方法, 从现在开始, read()方法将一次一个字节地从输入流中读取数据, 每读取一个字节, 你程序中的switch case语句就会判断执行一次, 遇到\n就打印输出这一行, 然后通过break跳出switch, 继续下一次循环.

这时候, 由于输入流中已无数据可读取, read()方法将再次阻塞, 而等待你的输入.


如有错误之处, 欢迎大家指出讨论...