0%

Java Scanner 类详解

前言

为了更好的人机交互,程序需要接收用户传输的信息并进行处理,Java在控制台中采用了Scanner类以获取用户输入的信息

Scanner英文直译为扫描器,从中也可以看出其作用。本篇博文将主要介绍Scanner类的常用用法以及特殊细节点并包含少量的底层原理。

需要自行查看底层代码时可翻阅之前我发布的博文查看如何快速查看申明,此处不再赘述。

用法

实例化

Constructs a new Scanner that produces values scanned from the specified input stream. Bytes from the stream are converted into characters using the underlying platform’s default charset.
Params:
source – An input stream to be scanned

1
2
3
public Scanner(InputStream source) {
this(new InputStreamReader(source), WHITESPACE_PATTERN);
}

这是我们最常用的一种构造方法,我们在控制台中想要获取用户输入的信息,通常只需要

1
Scanner scanner = new Scanner(System.in);

System类中,in的修饰为static InputStream,因此可以直接通过类.变量方法进行调用,满足Scanner类构建需要的参数。

当然还有另外几种构建方式

1
2
3
4
public Scanner(InputStream source, String charsetName) {
this(makeReadable(Objects.requireNonNull(source, "source"), toCharset(charsetName)),
WHITESPACE_PATTERN);
}

可以看出此处构造方法比上面一种多了一个参数 String charsetName,用于设置编码,编码种类较多,常用的有ANSI,UTF-8,GBK…以后会专门写一篇博文介绍。如果不填,默认使用UTF-8码。

方法及使用

ps.下文标题中的XXX包括了Line,Int,Double等等数据类型。

hasNextXXX

作用为判断下一行是否包含对应类型的值,若没有则返回 false,反之返回 true。

1
2
3
4
5
6
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextInt()) {
System.out.println("下一行包含 int 数字");
}
}

上面一段程序的左右就是检测下一行是否包含 int 型数字,若有则输出”下一行包含 int 数字”。

nextXXX

这个方法的作用为获取下一行对应类型的值,比如nextLine,则获取下一行的所有文字并存储为String变量。

1
2
3
4
5
6
7
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextLine()) {
String inputString = scanner.nextLine();
System.out.println("输入的文字为:" + inputString);
}
}

这里有细节点需要注意,nextLine是字符串取到\n(\n为换行符)为止,包含\n,而nextInt则不包含\n,所以两者同时调用时,通常会出现一些奇怪的问题,比如,在控制台中输入:

1
2
123
test

而此时通过以下代码去读取:

1
2
3
4
5
6
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int inputInt = scanner,nextInt();
String inputString = scanner.nextLine();
System.out.println(inputInt + inputString);
}

输出的结果为:123

具体原因上面已经讲了,没懂可以再看一遍。

原创技术分享,您的支持将鼓励我继续创作.