当前位置: 代码迷 >> Java相关 >> Scanner 和System.in.read 的使用
  详细解决方案

Scanner 和System.in.read 的使用

热度:639   发布时间:2010-06-05 18:24:12.0
Scanner 和System.in.read 的使用
2个循环
....
Scanner scnner=new Scnner(System.in);
for(int i=0;i<10;i++){
    System.out.println(i);
    sc.next();
     }
....
//打印结果
0
//输入一个
0
//的话则打印
1
//继续输入
...
for(int i=0;i<10;i++){
  System.out.println(i);
  system.in.read();
}
..
输出结果
0
//输入0000
//打印
1
2
3
//继续输入
......

问题:
2个都是在控制台输入
为啥第一个输入只执行一次循环,而第二个代码 也是输入一次咋执行3次循环呢?
搜索更多相关的解决方案: Scanner  read  System  

----------------解决方案--------------------------------------------------------
听说可能是开发环境的本身的漏洞,只是听说我原来问过
----------------解决方案--------------------------------------------------------
提示: 作者被禁止或删除 内容自动屏蔽
2010-06-06 12:58:45
爱OO你

等 级:论坛游侠
威 望:1
帖 子:30
专家分:181
注 册:2010-4-13
  得分:1 

System.in.read()返回int,
输入时只接收一个char,如输入123 只接收1,输入abc只接收a.这句是不对的,如下句,是先转化成Unicode码表示!!!

System.in.read()方法把接收到的数据都用Unicode码表示
System.in.read接收的是字节0-255 (接收一个8进制的数),
第一个输出很简单,是输入一个数.
说一下第二个:
0000是一个8进制的数,

当你输入0000时就读了3次,再加上子循环1次,就是输出结果0 1 2 3了.



[ 本帖最后由 爱OO你 于 2010-6-7 18:53 编辑 ]
----------------解决方案--------------------------------------------------------
提示: 作者被禁止或删除 内容自动屏蔽
2010-06-07 07:41:41
pigpigpigxk

等 级:论坛游侠
帖 子:26
专家分:109
注 册:2010-5-27
  得分:1 
按照4楼说法,那我输入1和1f,都只接受1了,是不?
但是我当我输入1f的时候,输出是 1 2 3 4。这到底是为什么?
错了,不是只接收第一个,而是接收全部的。

----------------解决方案--------------------------------------------------------
System.in.read()返回int,
输入时只接收一个char,如输入123 只接收1,输入abc只接收a.这句是不对的,如下句,是先转化成Unicode码表示!!!
System.in.read()方法把接收到的数据都用Unicode码表示
System.in.read接收的是字节0-255 (接收一个8进制的数),
第一个输出很简单,是输入一个数.
说一下第二个:
0000是一个8进制的数,
当你输入0000时就读了3次,再加上子循环1次,就是输出结果0 1 2 3了.
你也是错的,别忘了换行符。输入1,如果按字符输出是‘1’,‘\r’,‘\n’,所以是3次啦。所以你可以推出1f,1ff是多少次啦。
----------------解决方案--------------------------------------------------------
第一个问题:
这个主要取决于Scanner.next()的设计,
Returns the next token if it matches the pattern constructed from the specified string.
If the match is successful, the scanner advances past the input that matched the pattern.
而在Java的类Scanner源代码中表明了它的hasNext()是如何判断是否还有下一个元素的。使用下面的正则表达式
分割输入:   
private static Pattern WHITESPACE_PATTERN = Pattern.compile("\\p{javaWhitespace}+");

第二个问题:
这是InputStream的一个实现中的代码:
public synchronized int read() {
    return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
可以看出实际它就取得一个字节的数据。
----------------解决方案--------------------------------------------------------
回复 7楼 pigpigpigxk
提示: 作者被禁止或删除 内容自动屏蔽
2010-06-08 17:54:37
linjx0123

等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
  得分:1 
这个问题我在论坛上曾经回答过了。
System.in.read();
该方法输入数值的时候,最后两个字节为回车键和换行键。
你可以用System.out.println(System.in.read());进行测试。最后两个字节为10,13,根据ascII码表,查看可知是回车和换行

----------------解决方案--------------------------------------------------------
  相关解决方案