前言
为了更好的人机交互,程序需要接收用户传输的信息并进行处理,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 | public Scanner(InputStream source) { |
这是我们最常用的一种构造方法,我们在控制台中想要获取用户输入的信息,通常只需要
1 | Scanner scanner = new Scanner(System.in); |
System类中,in的修饰为static InputStream,因此可以直接通过类.变量方法进行调用,满足Scanner类构建需要的参数。
当然还有另外几种构建方式
1 | public Scanner(InputStream source, String charsetName) { |
可以看出此处构造方法比上面一种多了一个参数 String charsetName,用于设置编码,编码种类较多,常用的有ANSI,UTF-8,GBK…以后会专门写一篇博文介绍。如果不填,默认使用UTF-8码。
方法及使用
ps.下文标题中的XXX包括了Line,Int,Double等等数据类型。
hasNextXXX
作用为判断下一行是否包含对应类型的值,若没有则返回 false,反之返回 true。
1 | public static void main(String[] args) { |
上面一段程序的左右就是检测下一行是否包含 int 型数字,若有则输出”下一行包含 int 数字”。
nextXXX
这个方法的作用为获取下一行对应类型的值,比如nextLine,则获取下一行的所有文字并存储为String变量。
1 | public static void main(String[] args) { |
这里有细节点需要注意,nextLine是字符串取到\n(\n为换行符)为止,包含\n,而nextInt则不包含\n,所以两者同时调用时,通常会出现一些奇怪的问题,比如,在控制台中输入:
1 | 123 |
而此时通过以下代码去读取:
1 | public static void main(String[] args) { |
输出的结果为:123
具体原因上面已经讲了,没懂可以再看一遍。