Scanner
这个类在API中为util包下的一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。
A Scanner分隔符模式将输入打破到令牌,默认情况下匹配空格。 然后可以使用各种next方法将得到的令牌转换成不同类型的值。
这个类最实用的地方表现在获取控制台输入
通过Scanner 参数名称=new Scanner(System.in)
创建一个Scanner类,控制台会等待输入,敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的各种next方法即可。
例如,nextInt
允许用户从System.in读取一个数字:
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
next()
查找并返回此扫描仪的下一个完整令牌
使用next()
需要注意:
1. 一定要读取到有效字符后才可以结束输入。
2. 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
3. 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
4. next() 不能得到带有空格的字符串。
下面上代码:
public class note {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入一个数字串:");
// next()类型不能接收有空格的字符串
String str=scanner.next();
System.out.println("请输入一个数字:");
// nextInt只能接受int类型的字符,如果输入类型不对会导致InputMismatchException异常
int input=scanner.nextInt();
System.out.println(str);
System.out.println(input);
}
}
控制台:
请输入一个数字串:
abcd
请输入一个数字:
123
abcd
123
如果输入了带空格的字符串,结果如下:
nextLine()
将此扫描仪推进到当前行并返回跳过的输入。
使用nextLine()
需要注意:
1、以Enter为结束符,也就是说nextLine()
方法返回的是输入回车之前的所有字符。
2、可以获得空白。
System.out.println("请输入:");
String s=scanner.nextLine();
System.out.println(s);
控制台:
请输入:
a a d a
a a d a
很明显,nextLine()
可以获得空格,并不会因为空格而提前中止输入。
public class note {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入一个数字串:");
String str=scanner.next();
System.out.println("请输入一个数字:");
int input=scanner.nextInt();
System.out.println("请输入:");
String s=scanner.nextLine();
System.out.println(str);
System.out.println(input);
System.out.println(s);
}
}
控制台:
请输入一个数字串:
231das
请输入一个数字:
121
231das
121
请输入:
控制台会提前结束本次输入,也就是这种方法可能会在等待输入扫描时阻塞,即使以前的调用hasNext()返回了true 。是因为next()、nextInt()往往会读取部分数据(会留下"\n"或者空格之后的数据)。
注意:如果想要在nextInt()后读取一行,就得在nextInt()之后额外加上scanner.nextLine()
public class note {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入一个数字串:");
String str=scanner.next();
System.out.println("请输入一个数字:");
int input=scanner.nextInt();
//加入nextLine()
scanner.nextLine();
System.out.println("请输入:");
System.out.println(str);
System.out.println(input);
String s=scanner.nextLine();
System.out.println(s);
}
}
控制台:
请输入一个数字串:
daf
请输入一个数字:
12
请输入:
31ad
daf
12
31ad
结果可以输出下一行语句
hasNext()
如果此扫描仪在其输入中有另一个令牌,则返回true。
使用hasNext()
需要注意:
1. 输出为布尔值。
2. 判断输入的缓存中是否有效字符,遇到空格结束。
3. 如果只输入空格,不会匹配,返回false。
hasNextLine()
如果扫描仪的输入中有另一行,则返回true。
使用hasNextLine()
需要注意:
1.以Enter为结束符,判断此行有没有输入,空白输入也会返回true。
next() 、 hasNextLine() 、hasNext() 、nextLine()的区别
next()
是指针移动到当前下标,取出下一个输入
hasNext()
是检测还有没有下一个输入
nextLine()
把指针移动到下一行 让然后取出当前这一行的输入
hasNextLine()
是检测下一行有没有输入
在使用过程中应该正确搭配:
hasNext()
——> next()
hasNextLine()
——>nextLine()
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext()){
System.out.println(scanner.next());
}
控制台:
a b d
a
b
d
next对空格不匹配,当输入a b d时候,next只会读取a,缓存中剩下b d,在下一次循环时会继续上一个过程。所以循环了三次。
Scanner scanner=new Scanner(System.in);
while(scanner.hasNextLine()){
System.out.println(scanner.nextLine());
}
控制台:
a b d
a b d
nextLine会匹配空格,会继续向后输出。