黑马程序员技术交流社区

标题: 急急急!有关键盘录入的问题 [打印本页]

作者: 陈迎春    时间: 2013-3-26 09:40
标题: 急急急!有关键盘录入的问题
本帖最后由 陈迎春 于 2013-3-26 09:43 编辑

代码如下:
  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. public class ReadKey {
  4.         public static void main(String[] args) throws IOException {

  5.                 readKey2();               
  6.         }

  7.         public static void readKey2() throws IOException {
  8.                
  9.                 /*
  10.                  * 获取用户键盘录入的数据,
  11.                  * 并将数据变成大写显示在控制台上,
  12.                  * 如果用户输入的是over,结束键盘录入。
  13.                  *
  14.                  * 思路:
  15.                  * 1,因为键盘录入只读取一个字节,要判断是否是over,需要将读取到的字节拼成字符串。
  16.                  * 2,那就需要一个容器。StringBuilder.
  17.                  * 3,在用户回车之前将录入的数据变成字符串判断即可。
  18.                  *
  19.                  */
  20.                
  21.                 //1,创建容器。
  22.                 StringBuilder sb = new StringBuilder();
  23.                
  24.                 //2,获取键盘读取流。               
  25.                 InputStream in = System.in;
  26.                
  27.                 //3,定义变量记录读取到的字节,并循环获取。                 
  28.                 int ch = 0;      //我的问题是:我这样改下为什么不对了。int ch = in.read();  while(ch!=-1){..........}
  29.       
  30.                 while((ch=in.read())!=-1){
  31.                         
  32. //                        在存储之前需要判断是否是换行标记 ,因为换行标记不存储。
  33.                         if(ch=='\r')
  34.                                 continue;
  35.                         if(ch=='\n'){
  36.                                 String temp = sb.toString();
  37.                                 if("over".equals(temp))
  38.                                         break;
  39.                                 System.out.println(temp.toUpperCase());
  40.                                 sb.delete(0, sb.length());
  41.                         }
  42.                         else
  43.                         //将读取到的字节存储到StringBuilder中。
  44.                         sb.append((char)ch);
  45.                         
  46. //                        System.out.println(ch);
  47.                 }
  48.                
  49.         }
复制代码
我的问题在第30行,请大神帮忙解答下,在线等,谢谢了
作者: 我手心里的宝    时间: 2013-3-26 10:03
int ch = 0;      //我的问题是:我这样改下为什么不对了。int ch = in.read();  while(ch!=-1){..........}
in.read() 这样只能读一个字节,你在循环里要么死循环,要么不执行 你在把错误贴出来 我看看,你问的问题有些模糊
把错误提示贴出来
作者: 程宁宁    时间: 2013-3-26 10:34
像你那样改的话,就是死循环.while里没有结束条件,因为一直读不到-1.
你应该把读的动作in.read()放在while的条件判断里.
作者: 寇弘禄    时间: 2013-3-26 11:02
把 int ch = in.read(); 定义在外面相当于把键盘录入的第一个字符赋给ch 然后ch进入while循环始终保持这个值不变,如果开始ch满足不等于-1,循环就永远无法结束。

作者: 崔宝东    时间: 2013-3-26 12:03
int ch = 0;      //我的问题是:我这样改下为什么不对了。int ch = in.read();  while(ch!=-1){..........}你的这个问题明显是死循环;

int ch = in.read();  读取的是第一个字节,ch不为-1的话,while(ch!=-1){..........}永远都不能停止下来。ch=-1的话,循环就不会执行;
作者: 黑马十八期0513    时间: 2013-3-26 14:40
int ch = 0;      //我的问题是:我这样改下为什么不对了。int ch = in.read();  while(ch!=-1){..........}你的这个问题明显是死循环;
int ch=in.read(),ch的值为不文件的第一个字节,假如第一个字节为30,那么决断时就会出现while(30! =-1),30!=-1为true,也就是说这个while语句下的内容会被一直重复。你可以通过在while语句上打印ch的值来看出。
如果在while语句中这样写while((ch=in.read)!=-1),第一次读取ch时,是第一个字节的值,执行一次while循环中语句,然后再回来判定循环条件,此时in.read()方法读取的就是下一个字节。
作者: 陈迎春    时间: 2013-3-26 23:13
我手心里的宝 发表于 2013-3-26 10:03
int ch = 0;      //我的问题是:我这样改下为什么不对了。int ch = in.read();  while(ch!=-1){......... ...

谢谢哈,我懂了呢、、、、
作者: 陈迎春    时间: 2013-3-26 23:13
谢谢你们哈,我懂了那、、、
作者: 陈迎春    时间: 2013-3-26 23:17
我的贴子怎么改成已解决呀?谢谢啦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2