Scanner类简介:java
Java 5添加了java.util.Scanner类,咱们能够经过Scanner类来获取用户输入。它是之前的StringTokenizer和Matcher类之间的某种结合。因为任何数据都必须经过同一模式的捕获组检索或经过使用一个索引来检索文本的各个部分。因而能够结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式以外,Scanner类还能够任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,能够针对任何要处理的文本内容编写自定义的语法分析器。正则表达式
基本语法:spa
1 import java.util.Scanner; 2 public class ScannerDemo { 3 public static void main(String[] args) { 4 Scanner scan = new Scanner(System.in); 5 // 从键盘接收数据 6 // nextInt方式接收字符串 7 System.out.println("nextInt方式接收:"); 8 // 判断是否还有输入 9 if (scan.hasNextInt()) { 10 int i = scan.nextInt(); 11 System.out.println("输入的数据为:" + i); 12 } 13 scan.close(); 14 } 15 } 16 // 假如用户输入数据为:10,那么该程序结果为: 17 // 输入的数据为:10
部分API方法:code
其实上图的意思就是,好比:nextlnt():只读取int值,就是只能读取整数类型的数据,若是输入了非整型的数据(浮点型字符串等)就会报错。nextFloat()、nextDouble()这些也是以此类推,只能读取符合该类型的数据。对象
经常使用三个方法区别(next()、nextLine()、nextInt()):blog
①nextInt()只读取数值,读取完后\n没有读取而且光标放在本行索引
Scanner sc=new Scanner(System.in);内存
int i=sc.nextInt();资源
②next()方法遇到第一个扫描有效字符,即第一个非空格非换行符后面开始,一直获取到下一个空格,换行符以前的,单个字符串字符串
Scanner sc=new Scanner(System.in);
int i=sc.next();
③nextLine()能够扫描到一行内容并做为一个字符串而被获取到
Scanner sc=new Scanner(System.in);
int=sc.nextLine();
使用nextInt()、nextLine()出现的小问题及解决方法:
当Scanner对象同时使用nextInt()和nextLine()方法时,会出现nextLine()没有任何输出内容,以下代码:
1 import java.util.Scanner; 2 public class ScannerText{ 3 public static void main(String[] args){ 4 Scanner sc = new Scanner(System.in); 5 System.out.println("请输入数字"); 6 // 接收输入的数字 7 int number = sc.nextInt(); 8 System.out.println("请输入字符串"); 9 // 接收输入的字符串 10 String str = sc.nextLine(); 11 System.out.println("number:"+number+", str:"+str); 12 } 13 }
结果:
请输入数字 10 请输入字符串 number:10, srt:
// 能够发现,当咱们刚按照提示输入数字并回车时(我输入的是10并回车),代码直接执行到最后并结束了,这是为何呢?
由于:
nextInt():是键盘录入整数的方法,当咱们录入10 并回车的时候,其实在键盘上录入的是10和\r\n,nextInt()方法只获取到10就结束了
nextLine():是键盘录入字符串的方法,能够接受任意类型,可是他凭什么能获取一行呢?是经过\r\n,只要遇到\r\n就证实一行结束
因此:
在上述代码示例操做中,当咱们输入10并回车的时候,nextInt()在咱们输入10的时候就结束录入,而剩下的\r\n正好遇到nerxtLine()方法,而且仍是该方法的结束证实,因此,咱们还没按照提示输入字符串程序就已经结束;
解决方案一:
在输入第二次字符串的时候,在new一个Scanner对象(可是这种比较消耗内存资源,不推荐)
1 import java.util.Scanner; 2 public class ScannerText{ 3 public static void main(String[] args){ 4 Scanner sc1 = new Scanner(System.in); 5 System.out.println("请输入数字"); 6 // 接收输入的数字 7 int number = sc1.nextInt(); 8 System.out.println("请输入字符串"); 9 // 在输入第二次字符串的时候,再new一个scanner对象 10 Scanner sc2 = new Scanner(System.in); 11 // 接收输入的字符串 12 String str = sc2.nextLine(); 13 System.out.println("number:"+number+", str:"+str); 14 } 15 }
解决方案二:
无论是数字仍是字符串,都统一用nextLine()方法接收,接收以后在将结果进行处理,若是须要是int数据,将其结果转成int就ok
1 import java.util.Scanner; 2 public class ScannerText{ 3 public static void main(String[] args){ 4 Scanner scanner = new Scanner(System.in); 5 System.out.println("请输入数字"); 6 // 用String类型接收输入的数字 7 String str1 = scanner.nextLine(); 8 // 将String类型转换成int/Integer类型 9 int i = Integer.valueOf(str1); 10 // 查看数据类型 11 System.out.println("数据类型是:"+Integer.valueOf(str1).TYPE); 12 } 13 }
结果:
1 请输入数字 2 10 3 数据类型是:int