您的位置:首页 > 其它

Scanner类中的微妙关系

2015-08-21 18:03 351 查看

Scanner类中的微妙关系
--模范青蛙

java.util.Scanner是Java5的新特征,主要功能是简化文本扫描。这个类最实用的地方表现在获取控制台输入。Scanner是一个用正则表达式处理过的流,可以读入基本类型值。当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。
下面来分析一下这三个重要的方法
1.next()查看官方文档
Finds and returns the next complete token from this scanner.
A complete token is preceded and followed by input that matches
the delimiter pattern. This method may block while waiting for input to scan, even if a previous invocation of {@link #hasNext} returned
翻译过来是:查找并返回来自此扫描器的下一个完整标记。一个完整的令牌之前和之后的输入匹配定界符模式。在等待输入此方法可能阻塞扫描,即使{@link#hasNext}前一个调用返回。
简单的说就是:next()查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,所以next方法不能得到带空格的字符串。
2.nextLine()
Advances this scanner past the current line and returns the input that was skipped. This method returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line.
窗体顶端
此扫描器执行当前行,并返回跳过的输入信息。该方法返回当前行的其余部分,不包括任何行分隔符结尾。的位置设置为下一行的开头。
就是说:nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
3. nextInt()方法会读取下一个int型标志的token.但是焦点不会移动到下一行,仍然处在这一行上。当使用nextLine()方法时会读取改行剩余的所有的内容,包括换行符,然后把焦点移动到下一行的开头。所以这样就无法接收到下一行输入的String类型的变量。
下面通过两个实例来分析一下这三个方法的功能:

//next()与nextLine()的比较
import java.util.Scanner;
public class Test_000 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("输入一个字符串:");
String s1 = in.next();
System.out.print("输入一个字符串:");
String s2 = in.nextLine();
System.out.println("num="+s1+",str="+s2);
System.out.println("结束");
}
}
运行以上程序输出如下结果



因为在java中,next()方法是不接收空格的,在接收到有效数据前,所有的空格或者tab键等输入被忽略,若有有效数据,则遇到这些键退出。
当你在第一个字符串中输入的字符串有空格时,next()只会读取“模范”存储到s1里面。当nextline()的执行是以Enter作为结束标志的,由于他们同是一个reader对象,在缓存中输入的“ 青蛙”仍然会存在,当你输入完毕,Enter后,nextline()会自动将“ 青蛙”存放到s2中,因此控制台就出现了这样的结果。
结论:当next()和nextLine()连用时,nextLine()会自动接收next()函数的结束符,所以为了避免数据接收有误,要避免二个函数连用。
当然也可以在String s1 = in.next();后写上s1.nextLine();
这样输入输出就正常了。
//nextInt()与nextLine()的比较
import java.util.Scanner;
public class Test_000 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("输入一个整数:");
int i = in.nextInt();
System.out.print("输入一个字符串:");
String s = in.nextLine();
System.out.println("i="+i+",s="+s);
System.out.println("结束")
}
}
运行结果为:



当我把程序中第二个输入String s = in.nextLine();换成String s=in.next();
时,结果又恢复正常了。
主要是因为next()方法是以换行或者空格符为分界线接收下一个String类型变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: