Scanner类相当于一个简单的文本扫描器,主要用来处理一些简单的文本,能本将文本类型的字段根据正则表达式解析为java中的基本数据类型和字符串类型。
官方英文解释: A simple text scanner which can parse primitive types and strings using regular expressions.
Scanner类支持不同来源的文本,我们看一下Scanner所支持的构造函数。
在上面所涉及的构造函数中,最常用的就是Scanner(InputStream in)这个构造函数,支持直接读取在控制台输入的数据。在一些在线笔试编程中,这个构造函数的使用的必不可少的。
Scanner类实现了Iterator这个接口,因此需要重写hasNext()和next()这两个方法。其实Iterator这个接口中还有两个方法:remove()和forEachRemaining()。但是这两个方法在Iterator已经通过关键字default提供了默认的实现,因此在Scanner中可以不实现这两个方法。(注:default这个关键字在java8中才出现的,之前的版本在接口中是不能提供方法的默认实现的。各位可以想一下既然接口中也可以提供方法的默认实现,那么接口和抽象类有啥区别呢?)。
在下面就简单分析下一些Scanner类中的一些常用的方法,和给出一些简单的测试用例,相信这些东西差不多够用了。。。
测试用例一:
import java.util.Scanner;
/**
* Created by jiangchangwei on 2017/5/31.
* calculate a + b
*/
public class ScannerTest1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//这一步就是想查看下字段之间的默认分隔符
System.out.println("delimiter is:" + scanner.delimiter());
int a = scanner.nextInt();
int b = scanner.nextInt();
System.out.println("a + b = " + (a + b));
}
}
Output:
上面是最简单的用法,仅仅是求出a+b之和。并且由结果可知,默认的分隔符为:\p{javaWhitespace}+(这个分隔符的定义包括:多个空白符、制表符和换行符}。
常用的方法:
useDelimiter(Pattern p) 和 useDelimiter(String s)
这两个方法用的还是比较多的,主要是用来修改字符之间的默认分隔符。
测试用例二:
import java.util.Arrays;
import java.util.Scanner;
/**
* Created by jiangchangwei on 2017/6/1.
*/
public class ScannerTest2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] result = new int[5];
System.out.println("默认分隔符为:" + scanner.delimiter());
//修改默认的分隔符
scanner.useDelimiter(",");
System.out.println("修改之后的分隔符为:" + scanner.delimiter());
for(int i = 0; i < 5; i++) {
result[i] = scanner.nextInt();
}
System.out.println("result数组中的值为:" + Arrays.toString(result));
}
}
Output:
由以上代码知,可以根据我们自己的需要,更改分隔符。
而Scanner类中还有两类的方法是比较重要的:一类是以hasNext开头的方法,一类是以next开头的方法:
这两类方法没有什么好说的,一类方法用来判断下一个需要的值是否存在,一类用来取下一个需要的值。
总结:Scanner类主要方便于我们处理一些文本,主要使用的就是正则表达式来匹配所对应的类型。在平常的应用中,写一些算法或者自己写一些测试类用的较多。大家就适当用一下这个类,不要过度使用,因为你会发现用的输入还是会有些小问题。比如:使用”,”分隔符,使用控制台输入时,必须文本后面还得跟一个逗号。不然会报异常之类。只能说java在这方面和其他的脚本语言差的不是一点半点。比如python,处理起来方便多了。(最好了解下java中的处理正则表达式的Pattern等类,正则表达式在一些场合还是能发挥奇效的)