1. Scanner的概述

  • 一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。
  • Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。 

如:

Scanner sc = new Scanner(System.in);
int i = sc.nextInt();  // 使用户能够从 System.in 中读取一个数

 

通过 myNumbers 文件,遍历文件的文本内容,通过分隔符间隔的词的类型为Long,则将结果存储到aLong变量中:

Scanner sc = new Scanner(new File("myNumbers"));
while (sc.hasNextLong()) {
    long aLong = sc.nextLong();
}

 

从一个字符串读取若干项:

     String input = "1 fish 2 fish red fish blue fish";
        Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
        System.out.println(s.nextInt());
        System.out.println(s.nextInt());
        System.out.println(s.next());
        System.out.println(s.next());
        s.close(); 
        /*
        输出
            1
            2
            red
            blue
         */

 

扫描器所使用的默认空白分隔符通过 Character.isWhitespace 来识别。不管以前是否更改,reset() 方法将把扫描器分隔符的值重置为默认空白分隔符。 

 

扫描操作可能被阻塞,而等待信息的输入。 

 

2. Scanner的构造方法原理

  • Scanner(File source)   从指定文件扫描生成值
  • Scanner(File source, String charsetName)  
    • Scanner sc = new Scanner(new File("myNumbers"));
  • Scanner(InputStream source)  从指定的输入流扫描生成值
  • Scanner(InputStream source, String charsetName)
    • Scanner sc = new Scanner(System.in);
    • 这种就是从 标准的键盘输入 
  • Scanner(Readable source)  从指定源扫描生成值
  • Scanner(ReadableByteChannel source)  从指定信道扫描生成值
  • Scanner(ReadableByteChannel source, String charsetName)   
  • Scanner(String source)  从指定字符串扫描生成值
    • String input = "1 fish 2 fish red fish blue fish";
      Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");

 

Scanner获取数据出现的小问题以及解决方案:

  • 常用方法:
    • public int nextInt(); 获取一个int类型的值
    • public String nextLine();  获取一个String类型的值
  • 案例演示
    • 先演示获取多个int值,多个String值的情况
    • 再演示先获取int值,然后获取String值出现问题
    • package com.heima.scanner;
      
      import java.util.Scanner;
      
      public class Demo2_Scanner {
          public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);
              
              // 连续输入两个整数,int类型
              /*System.out.println("请输入第一个整数:");
              int i = sc.nextInt();
              System.out.println("请输入第二个整数:");
              int j = sc.nextInt();
              System.out.println("i = " + i + ", j = " + j);*/
              
              // 连续输入两个字符串,String类型
              /*System.out.println("请输入第一个字符串:");
              String line1 = sc.nextLine();
              System.out.println("请输入第二个字符串:");
              String line2 = sc.nextLine();
              System.out.println("line1 = " + line1 + ", line2 = " + line2);*/
              
              System.out.println("请输入第一个整数:");
              int i = sc.nextInt();
              System.out.println("请输入第二个字符串:");
              String line2 = sc.nextLine();
              System.out.println("i = " + i + ", line2 = " + line2);
              
              /*
               * 输出:
               请输入第一个整数:
              11
              请输入第二个字符串:
              i = 11, line2 = 
              
              
              出错情况:输入第一个整数后,没有直接等待键盘输入的第二个字符串,直接输出了拼接结果。
              
              出错原因分析:
              nextInt() 是键盘录入整数的方法。
              当我们录入11的时候,其实在键盘上录入的是10和\r\n,nextInt()方法只获取10就结束了。
              nextLine() 是键盘录入字符串的方法,可以接收任意类型,但是,它凭什么能获取一行呢?
              通过\r\n,只要遇到\r\n就证明一行结束。
              
              */
          }
      }
      View Code

相关文章: