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就证明一行结束。 */
      }
      }
    • 问题解决方案:
      • 第一种:先获取一个数值后,再创建一个新的键盘录入对象获取字符串

        • 创建两次对象,但是浪费空间
      • 第二种:把所有的数据先按照字符串获取,然后要什么,就对应转换为什么

3. 一般方法

  • close() 关闭扫描器
  • hasNext()   如果此扫描器的输入中有另一个标记,则返回 true。
  • hasNext(Pattern pattern)  如果下一个完整标记与指定模式匹配,则返回 true。
  • hasNextInt()   如果通过使用 nextInt() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 int 值,则返回 true。
  • nextInt()  将输入信息的下一个标记扫描为一个 int
  • nextLine()  此扫描器执行当前行,并返回跳过的输入信息。

next() 和 hasNext() 方法及其基本类型 companion 方法(如 nextInt() 和 hasNextInt())首先跳过与分隔符模式匹配的输入,然后尝试返回下一个标记。

在等待更多输入时 hasNext 和 next 方法都可能阻塞。

hasNext 方法是否阻塞与其相关的 next 方法是否阻塞无关。

findInLine(java.lang.String)findWithinHorizon(java.lang.String,int) 和 skip(java.util.regex.Pattern) 方法的执行与分隔符模式无关。

这些方法会尝试匹配与输入中的分隔符无关的指定模式,因此可用于分隔符无关的特殊环境中。在等待更多输入时这些方法可能阻塞。

当某一扫描器抛出 InputMismatchException 时,该扫描器不会传递导致该异常的标记,因此可以通过其他某种方法来获取或跳过它。

对于某些类型的分隔模式,可能返回空标记。例如,"\\s+" 模式不会返回空标记,因为它与该分隔符的多个实例匹配。而分隔模式 "\\s" 可能返回空标记,因为它一次只传递一个空格。

扫描器可以从实现 Readable 接口的任何对象读取文本。如果对底层 readable 的 Readable.read(java.nio.CharBuffer) 方法的调用抛出 IOException,则扫描器认为已经到达了输入的结尾。底层 readable 最新抛出的 IOException 可以通过 ioException() 方法获取。

如果 Scanner 关闭,且其输入源实现 Closeable 接口,则该输入源也将关闭。

若没有外部同步,则 Scanner 的多线程使用是不安全的。

除非另行说明,否则将一个 null 参数传递到 Scanner 的任何一个方法中都将抛出 NullPointerException

默认情况下扫描器会将数字解释为十进制形式,除非已经使用 useRadix(int) 方法设置了不同的基数。不管以前是否更改,reset() 方法将把扫描器的基数重置为10 。

【JAVA基础】11 Scanner类的更多相关文章

  1. Java基础之Scanner类中next()与nextLine()方法的区别

    java中使用Scanner类实现数据输入十分简单方便,Scanner类中next()与nextLine()都可以实现字符串String的获取,所以我们会纠结二者之间的区别. 其实next()与nex ...

  2. Java基础教程——Scanner类

    Scanner属于java.util包. java.util包是Java内置的一个工具包,其中包含一系列常用的工具类,如处理日期.日历.集合类: 如果要使用到该包中的类,必须显式引入包名:import ...

  3. Java基础-DButils工具类(QueryRunner)详解

    Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...

  4. Java常用API(Scanner类)

    Java常用API( Scanner类)1 1.Scanner类 首先给大家介绍一下什么是JavaAPI API(Application Programming Interface),应用程序编程接口 ...

  5. java基础(11) -JDBC

    java基础(11) -JDBC jdbc 1.装载驱动 载入跟数据库建立连接的驱动 /* sql server: String className ="com.microsoft.sqls ...

  6. Java 常用对象-Scanner类

    2017-11-02 16:33:11 Scanner类:一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器. Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白 ...

  7. Java基础之File类的使用

    Java基础之File类的使用 1.File类的构造方法和常用方法 2.对File中listFile(FileNameFilter name)学习 3.与File文件类相关的实现 File类的构造方法 ...

  8. Java Character & String & Scanner类

    Character类 Character 类用于对单个字符进行操作. Character 类在对象中包装一个基本类型 char 的值 char用法: char ch = 'a'; // Unicode ...

  9. Java入门 - 语言基础 - 21.Scanner类

    原文地址:http://www.work100.net/training/java-scanner.html 更多教程:光束云 - 免费课程 Scanner类 序号 文内章节 视频 1 概述 2 使用 ...

  10. Java基础(Scanner、Random、流程控制语句)

    第3天 Java基础语法 今日内容介绍 u 引用数据数据类型(Scanner.Random) u 流程控制语句(if.for.while.dowhile.break.continue) 第1章 引用数 ...

随机推荐

  1. 如何让Java应用成为杀不死的小强?(下篇)

    各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 经过前两期的铺垫及烧脑的分享,我们大概对「如何实现 Java 应用进程的状态监控,如果被监控的进程 down 掉,是否 ...

  2. jq日历一周为单位轮播

    简单效果图: 代码如下: <!doctype html> <html lang="en"> <head> <meta charset=&q ...

  3. CTF中常用的php伪协议利用

    1.file:// 作用: 用于访问文件(绝对路径.相对路径.网络路径) 示例: http://www.xx.com?file=file:///etc/passsword 2.php:// 作用:访问 ...

  4. PTA数据结构与算法题目集(中文) 7-8

    PTA数据结构与算法题目集(中文)  7-8 7-8 哈利·波特的考试 (25 分)   哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是 ...

  5. Centos网络的配置

                                                                                                        ...

  6. php人民币小写转大写函数,不限长度,精确到分

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ustb80.blog.51cto.com/6139482/1035327 在打印 ...

  7. Python 1基础语法二(标识符、关键字、变量和字符串)

    一.标识符 标识符就是程序员自己命名的变量名.名字需要有见名知义的效果,不要随意起名 :比如 a=1 a是个变量,a这个变量名属于标识符 1 company = '小米 2 employeeNum = ...

  8. 用ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统

    用http://ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统 背景:前段时间,给一家公司做外包(就是图标是朵菊花那家).为了尽快实现交付,网上四处寻找适合中小型企 ...

  9. For循环详解

    for语句 学过c语言都对循环结构不陌生,尤其是for循环,他是C语言中最有特色的循环语句,使用最为灵活. 形式 结构:for(表达式1:表达式2:表达式3){循环体结构} 每部分的作用 表达式1:一 ...

  10. Java方法的重点

    方法就是完成功能一个语句集合体 使用方法的原则:方法的原子性,一个方法只实现一个功能. 方法的重载 1.函数名必须相同 2.形参列表必须不同(可以是个数不同,类型不同,不然完全一样) 3.返回值可以相 ...