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方法
Modifier and Type | 方法 | 描述 | |
---|---|---|---|
1 | void | close() | 关闭此扫描仪。 |
2 | Pattern | delimiter() | 返回 |
3 | Stream<MatchResult> | findAll(String patString) | 返回与提供的模式字符串相匹配的匹配结果流。 |
4 | Stream<MatchResult> | findAll(Pattern pattern) | 返回此扫描仪的匹配结果流。 |
5 | String | findInLine(String pattern) | 尝试查找从指定字符串构造的模式的下一个出现,忽略分隔符。 |
6 | String | findInLine(Pattern pattern) | 尝试找到忽略分隔符的指定模式的下一个出现。 |
7 | String | findWithinHorizon(String pattern, int horizon) | 尝试查找从指定字符串构造的模式的下一个出现,忽略分隔符。 |
8 | String | findWithinHorizon(Pattern pattern, int horizon) | 尝试找到指定模式的下一个出现。 |
9 | boolean | hasNext() | 如果此扫描仪在其输入中有另一个令牌,则返回true。 |
10 | boolean | hasNext(String pattern) | 如果下一个令牌匹配从指定字符串构造的模式,则返回true。 |
11 | boolean | hasNext(Pattern pattern) | 如果下一个完整的令牌匹配指定的模式,则返回true。 |
12 | boolean | hasNextBigDecimal() | 如果此扫描仪输入中的下一个标记可以使用 |
13 | boolean | hasNextBigInteger() | 如果此扫描仪输入中的下一个标记可以使用 |
14 | boolean | hasNextBigInteger(int radix) | 如果此扫描仪输入中的下一个标记可以使用 |
15 | boolean | hasNextBoolean() | 如果此扫描器输入中的下一个标记可以使用从字符串“true | false”创建的不区分大小写的模式解释为布尔值,则返回true。 |
16 | boolean | hasNextByte() | 如果此扫描仪输入中的下一个标记可以使用 |
17 | boolean | hasNextByte(int radix) | 如果此扫描仪输入中的下一个标记可以使用 |
18 | boolean | hasNextDouble() | 如果该扫描仪输入中的下一个标记可以使用 |
19 | boolean | hasNextFloat() | 如果此扫描仪输入中的下一个标记可以使用 |
20 | boolean | hasNextInt() | 如果此扫描仪输入中的下一个标记可以使用 |
21 | boolean | hasNextInt(int radix) | 如果扫描仪的输入中的下一个标记可以使用 |
22 | boolean | hasNextLine() | 如果扫描仪的输入中有另一行,则返回true。 |
23 | boolean | hasNextLong() | 如果此扫描仪的输入中的下一个令牌可以使用 |
24 | boolean | hasNextLong(int radix) | 如果此扫描仪输入中的下一个标记可以使用 |
25 | boolean | hasNextShort() | 如果此扫描仪输入中的下一个标记可以使用 |
26 | boolean | hasNextShort(int radix) | 如果此扫描仪输入中的下一个标记可以使用 |
27 | IOException | ioException() | 返回 |
28 | Locale | locale() | 返回此扫描仪的区域设置。 |
29 | MatchResult | match() | 返回此扫描仪执行的最后扫描操作的匹配结果。 |
30 | String | next() | 查找并返回此扫描仪的下一个完整令牌。 |
31 | String | next(String pattern) | 如果匹配从指定字符串构造的模式,则返回下一个令牌。 |
32 | String | next(Pattern pattern) | 如果匹配指定的模式,则返回下一个令牌。 |
33 | BigDecimal | nextBigDecimal() | 将输入的下一个标记扫描为 |
34 | BigInteger | nextBigInteger() | 将输入的下一个标记扫描为 |
35 | BigInteger | nextBigInteger(int radix) | 将输入的下一个标记扫描为 |
36 | boolean | nextBoolean() | 将输入的下一个标记扫描为布尔值,并返回该值。 |
37 | byte | nextByte() | 将输入的下一个标记扫描为 |
38 | byte | nextByte(int radix) | 将输入的下一个标记扫描为 |
39 | double | nextDouble() | 将输入的下一个标记扫描为 |
40 | float | nextFloat() | 将输入的下一个标记扫描为 |
41 | int | nextInt() | 将输入的下一个标记扫描为 |
42 | int | nextInt(int radix) | 将输入的下一个标记扫描为 |
43 | String | nextLine() | 将此扫描仪推进到当前行并返回跳过的输入。 |
44 | long | nextLong() | 将输入的下一个标记扫描为 |
45 | long | nextLong(int radix) | 将输入的下一个标记扫描为 |
46 | short | nextShort() | 将输入的下一个标记扫描为 |
47 | short | nextShort(int radix) | 将输入的下一个标记扫描为 |
48 | int | radix() | 返回此扫描仪的默认基数。 |
49 | void | remove() |
|
50 | Scanner | reset() | 重设此扫描仪。 |
51 | Scanner | skip(String pattern) | 跳过与指定字符串构成的模式匹配的输入。 |
52 | Scanner | skip(Pattern pattern) | 跳过与指定模式匹配的输入,忽略分隔符。 |
53 | Stream<String> | tokens() | 从此扫描仪返回一个分隔符的分隔符号流。 |
54 | String | toString() | 返回此 |
55 | Scanner | useDelimiter(String pattern) | 将此扫描仪的分隔模式设置为从指定的 |
56 | Scanner | useDelimiter(Pattern pattern) | 将此扫描仪的分隔模式设置为指定的模式。 |
57 | Scanner | useLocale(Locale locale) | 将此扫描仪的区域设置设置为指定的区域设置。 |
58 | Scanner | useRadix(int radix) | 将此扫描仪的默认基数设置为指定的基数 |