Scanner类的关系
1.继承关系
public final class Scanner
extends Object
implements Iterator<String>, Closeable
一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。Scanner使用分隔符模式将其输入打破令牌,默认情况下匹配空格。 然后可以使用各种next方法将得到的令牌转换成不同类型的值。
常见问题
1.Scanner常见混淆
好多人其实不能区分next(),nextLine()等的区别,这个我以我自己的理解解释一下:
(1)next()
其实,Scanner默认输入时以空格结束输入,比如说我们经常用的next():
对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,即next不会读取有效字符之前的空格、回车等字符,但是输入有效字符后,next()方法会将其后输入的空格键、Tab键或Enter键等视为结束符。
(2)next Line()
而nextLine会读取任意字符:
会读取空格、回车等字符,nextLine()方法的结束符只是Enter键。
当nextLine()前面有next()方法时,nextLine()会读取到被next()去掉的Enter而结束自己的读取
2.Scanner的输入分隔
其实,Scanner默认分隔是空格,但是,有时我们要用其他的符号进行分隔,我们该怎么办呢?
接下来,看一个实例:
import java.util.*;
public class try04 {
public static void main(String[] args) {
String input = "1 fish 2 fish red fish blue fish";
Scanner s=new Scanner(input).useDelimiter("\\sfish\\s");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close();
}
}
输出结果:
如果你要用不一样的分隔符,你可以用seDelimiter()方法进行分隔。
下面,用正则表达式进行分隔:
import java.util.regex.MatchResult;
public class try04 {
public static void main(String[] args) {
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input);
s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i++)
System.out.println(result.group(i));
s.close();
}
}
输出结果:
Scanner方法
Scanner的方法
Modifier and Type | 方法 | 描述 | |
1 |
|
| 关闭此扫描仪。 |
2 |
|
| 返回 |
3 |
|
| 返回与提供的模式字符串相匹配的匹配结果流。 |
4 |
|
| 返回此扫描仪的匹配结果流。 |
5 |
|
| 尝试查找从指定字符串构造的模式的下一个出现,忽略分隔符。 |
6 |
|
| 尝试找到忽略分隔符的指定模式的下一个出现。 |
7 |
|
| 尝试查找从指定字符串构造的模式的下一个出现,忽略分隔符。 |
8 |
|
| 尝试找到指定模式的下一个出现。 |
9 |
|
| 如果此扫描仪在其输入中有另一个令牌,则返回true。 |
10 |
|
| 如果下一个令牌匹配从指定字符串构造的模式,则返回true。 |
11 |
|
| 如果下一个完整的令牌匹配指定的模式,则返回true。 |
12 |
|
| 如果此扫描仪输入中的下一个标记可以使用 nextBigDecimal()方法解释为 |
13 |
|
| 如果此扫描仪输入中的下一个标记可以使用 nextBigInteger()方法将其解释为默认基数中的 |
14 |
|
| 如果此扫描仪输入中的下一个标记可以使用 nextBigInteger()方法将其解释为指定基数中的 |
15 |
|
| 如果此扫描器输入中的下一个标记可以使用从字符串“true | false”创建的不区分大小写的模式解释为布尔值,则返回true。 |
16 |
|
| 如果此扫描仪输入中的下一个标记可以使用 nextByte()方法将其解释为默认基数中的字节值,则返回true。 |
17 |
|
| 如果此扫描仪输入中的下一个标记可以使用 nextByte()方法将其解释为指定基数中的字节值,则返回true。 |
18 |
|
| 如果该扫描仪输入中的下一个标记可以使用 nextDouble()方法将其解释为双重值,则返回true。 |
19 |
|
| 如果此扫描仪输入中的下一个标记可以使用 nextFloat()方法将其解释为浮点值,则返回true。 |
20 |
|
| 如果此扫描仪输入中的下一个标记可以使用 nextInt()方法将其解释为默认基数中的int值,则返回true。 |
21 |
|
| 如果扫描仪的输入中的下一个标记可以使用 nextInt()方法解释为指定基数中的int值,则返回true。 |
22 |
|
| 如果扫描仪的输入中有另一行,则返回true。 |
23 |
|
| 如果此扫描仪的输入中的下一个令牌可以使用 nextLong()方法将其解释为默认基数中的长值,则返回true。 |
24 |
|
| 如果此扫描仪输入中的下一个标记可以使用 nextLong()方法将其解释为指定基数中的长 整型值,则返回true。 |
25 |
|
| 如果此扫描仪输入中的下一个标记可以使用 nextShort()方法将其解释为默认基数中的一个短值,则返回true。 |
26 |
|
| 如果此扫描仪输入中的下一个标记可以使用 nextShort()方法将其解释为指定基数中的一个短值,则返回true。 |
27 |
|
| 返回 |
28 |
|
| 返回此扫描仪的区域设置。 |
29 |
|
| 返回此扫描仪执行的最后扫描操作的匹配结果。 |
30 |
|
| 查找并返回此扫描仪的下一个完整令牌。 |
31 |
|
| 如果匹配从指定字符串构造的模式,则返回下一个令牌。 |
32 |
|
| 如果匹配指定的模式,则返回下一个令牌。 |
33 |
|
| 将输入的下一个标记扫描为BigDecimal 。 |
34 |
|
| 将输入的下一个标记扫描为BigInteger 。 |
35 |
|
| 将输入的下一个标记扫描为BigInteger 。 |
36 |
|
| 将输入的下一个标记扫描为布尔值,并返回该值。 |
37 |
|
| 将输入的下一个标记扫描为 |
38 |
|
| 将输入的下一个标记扫描为 |
39 |
|
| 将输入的下一个标记扫描为 |
40 |
|
| 将输入的下一个标记扫描为 |
41 |
|
| 将输入的下一个标记扫描为 |
42 |
|
| 将输入的下一个标记扫描为 |
43 |
|
| 将此扫描仪推进到当前行并返回跳过的输入。 |
44 |
|
| 将输入的下一个标记扫描为 |
45 |
|
| 将输入的下一个标记扫描为 |
46 |
|
| 将输入的下一个标记扫描为 |
47 |
|
| 将输入的下一个标记扫描为 |
48 |
|
| 返回此扫描仪的默认基数。 |
49 |
|
|
|
50 |
|
| 重设此扫描仪。 |
51 |
|
| 跳过与指定字符串构成的模式匹配的输入。 |
52 |
|
| 跳过与指定模式匹配的输入,忽略分隔符。 |
53 |
|
| 从此扫描仪返回一个分隔符的分隔符号流。 |
54 |
|
| 返回此 |
55 |
|
| 将此扫描仪的分隔模式设置为从指定的 |
56 |
|
| 将此扫描仪的分隔模式设置为指定的模式。 |
57 |
|
| 将此扫描仪的区域设置设置为指定的区域设置。 |
58 |
|
| 将此扫描仪的默认基数设置为指定的基数 |