A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 3040789425 中级黑马   /  2014-8-22 23:25  /  1270 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 3040789425 于 2014-8-23 12:27 编辑

package test;
/**从键盘输入数据,当数据为一行时,输出,并输入over结束程序*/
import java.io.IOException;
import java.io.InputStream;

public class SystemInDemo {

        /**
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
                // TODO Auto-generated method stub
          SystemIn.In();
        }

}
class SystemIn
{
        
        public static void In() throws IOException {
        InputStream inputstream=System.in;                                      
        StringBuilder stringbuilder=new StringBuilder();

        while(true)
        {        
                int ch=inputstream.read();
                if(ch=='\r')
                        continue;
                if(ch=='\n'){
                        String str=stringbuilder.toString();
                if(str.equals("over"))
                        break;
                System.out.println(str);
                stringbuilder.delete(0, stringbuilder.length());
             }   else
                        stringbuilder.append((char)ch);
                        
        }        
        }
}
  问题
       1. 为什么输入函数并没有在循环体中,程序却可以在运行完一次输入,判断可以再次键盘输入数据并继续判断输出???
      2. 行分割符为\r\n, 为什么用键盘输入\r\n却不会被识别为行分隔符???
    3.  为什么程序是遇到break 后结束,而不是在运行完循环体后直接结束?????




5 个回复

倒序浏览
1.read是阻塞式方法,而且读取操作在while(true)循环中,这个循环条件为true,所以没有人为加结束标记的话它会一直循环下去。
2.我想可能是这样:当你输入\r\n时,上面程序中有针对它的判断语句(就是上面那两个if),等到读到n时它把整个存储进缓冲区的字符转化成字符串了,失去了换行的作用。
3.这是循环的知识啊?本来不就是遇到break就停止吗?遇到continue会继续下一次循环,而遇到break就结束整个循环,这应该不会有问题啊?
回复 使用道具 举报
1、因为你并没有跳出循环,while的判断条件为true。2、'\r'和'\n'在判断时会自动的转换成对应的ASCII值,再与ch进行比较。所以要分开,不然怎么和int型的ch比。3、break是跳出所在层的循环。
回复 使用道具 举报
依然超级赛亚人 发表于 2014-8-23 08:12
1.read是阻塞式方法,而且读取操作在while(true)循环中,这个循环条件为true,所以没有人为加结束标记的话 ...

1. 为什么输入函数并没有在循环体中,程序却可以在运行完一次输入,判断可以再次键盘输入数据并继续判断输出???
InputStream inputstream=System.in;inputstream.read();
方法只要程序没结束就一直获取键盘输入值,并且循环体在遇到OVER之前都在运行,所以就可以一直获取并判断,并且键盘输入一个字符就读取并判断一个,只是遇到换行符才输出而已
      2. 行分割符为\r\n, 为什么用键盘输入\r\n却不会被识别为行分隔符???
因为输入\n 会被识别为\和n因为当输入\时,\就被当作一个字符读取了,所以自己输入的\r\n并不是换行符
    3.  为什么程序是遇到break 后结束,而不是在运行完循环体后直接结束?????
        这个问题其实我是跟第一个问题重复了,因为读取键盘方法只要程序运行就会一直读取,所以当循环体结束时,整个程序就可以结束了,




谢谢你的回答在你的帮助下~~~我看懂了哦~~~~~~~~~~~~:#
回复 使用道具 举报
﹑淼 发表于 2014-8-23 09:20
1、因为你并没有跳出循环,while的判断条件为true。2、'\r'和'\n'在判断时会自动的转换成对应的ASCII值,再 ...

谢谢哦~~~~:)
回复 使用道具 举报
楼上分析不错,很基本的,先记住就好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马