• Java-API简析_java.util.Scanner类(基于 Latest JDK)(浅析源码)


    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
    https://blog.csdn.net/m0_69908381/article/details/133872926
    出自【进步*于辰的博客

    文章目录

    1、概述

    继承关系:

    • java.lang.Object
      • java.util.Scanner

    实现的所有接口
    CloseableAutoCloseableIterator


    public final class Scanner extends Object implements Iterator, Closeable

    一个简单的文本扫描程序,可以使用正则表达式解析基本类型和字符串。

    Scanner使用分隔符模式将其输入分解为标记,该分隔符模式默认匹配空格。 将得到的令牌可以然后被转换成使用各种不同类型的值next()方法。

    例如,此代码允许用户从System.in读取数字:

    Scanner sc = new Scanner(System.in);
    int i = sc.nextInt();
    
    • 1
    • 2

    作为另一个示例,此代码允许从文件myNumbers条目分配 long 类型:

    Scanner sc = new Scanner(new File("myNumbers"));
    while (sc.hasNextLong()) {
        long aLong = sc.nextLong();
    }
    
    • 1
    • 2
    • 3
    • 4

    扫描仪还可以使用除空白之外的分隔符。 此示例从字符串中读取几个项目:

    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
    • 3
    • 4
    • 5
    • 6
    • 7

    打印以下输出:

    1
    2
    red
    blue
    
    • 1
    • 2
    • 3
    • 4

    使用此代码可以生成相同的输出,该代码使用正则表达式一次解析所有四个标记:

    String input = "1 fish 2 fish red fish blue fish";
    Scanner s = new Scanner(input);
    s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
    MatchResult result = s.match();
    for (int i=1; i<=result.groupCount(); i++)
        System.out.println(result.group(i));
    s.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4502201395911识别扫描仪使用的default whitespace delimiterreset()将扫描仪分隔符的值重置为默认的空白分隔符,无论它是否先前已更改。

    扫描操作可能阻止等待输入。

    next()hasNext()及其伴随方法(例如nextInt()hasNextInt() )首先跳过与分隔符模式匹配的任何输入,然后尝试返回下一个标记。 hasNext()next()都可能阻止等待进一步输入。 hasNext()方法块是否与其关联的next()是否将阻止next()tokens()方法还可以阻止等待输入。

    findInLine()findWithinHorizon()skip()findAll()定界符模式的独立操作。 这些方法将尝试匹配指定的模式而不考虑输入中的分隔符,因此可以在分隔符不相关的特殊情况下使用。 这些方法可能会阻止等待更多输入。

    当扫描程序抛出InputMismatchException时 ,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过它。

    根据分隔模式的类型,可以返回空标记。 例如,模式"\\s+"将不返回空标记,因为它匹配分隔符的多个实例。 "\\s"模式可以返回空标记,因为它一次只通过一个空格

    扫描程序可以从任何实现 Readable 接口的对象读取文本。 如果对底层可读read()的调用抛出IOException,则扫描程序会假定已到达输入的结尾。 可以通过ioException()检索由底层可读引发的最新 IOException 。

    当 Scanner 关闭时,如果源实现 Closeable 接口,它将关闭其输入源。

    Scanner 对于没有外部同步的多线程使用是不安全的。

    除非另有说明,否则将null参数传递给任何方法,将导致抛出NullPointerException

    除非使用useRadix(int)设置了不同的基数,否则扫描仪将默认将数字解释为十进制。 无论先前是否更改过扫描仪, reset()都会将扫描仪基数的值重置为10

    Localized numbers

    此类的实例能够扫描标准格式的数字以及扫描程序的语言环境的格式。 扫描仪initial localeLocale.getDefault(Locale.Category.FORMAT)返回的值。它可以通过useLocale()更改。 reset()将扫描程序的语言环境的值重置为初始语言环境,无论它是否先前已更改。

    本地化格式是根据以下参数定义的,对于特定区域设置,这些参数取自该区域设置的 DecimalFormat 对象df及其 DecimalFormatSymbols 对象dfs

    LocalGroupSeparator   
    The character used to separate thousands groups, i.e.,  dfs. getGroupingSeparator() 
    
    LocalDecimalSeparator   
    The character used for the decimal point, i.e.,  dfs. getDecimalSeparator() 
    
    LocalPositivePrefix   
    The string that appears before a positive number (may be empty), i.e.,  df. getPositivePrefix() 
    
    LocalPositiveSuffix   
    The string that appears after a positive number (may be empty), i.e.,  df. getPositiveSuffix() 
    
    LocalNegativePrefix   
    The string that appears before a negative number (may be empty), i.e.,  df. getNegativePrefix() 
    
    LocalNegativeSuffix   
    The string that appears after a negative number (may be empty), i.e.,  df. getNegativeSuffix() 
    
    LocalNaN   
    The string that represents not-a-number for floating-point values, i.e.,  dfs. getNaN() 
    
    LocalInfinity   
    The string that represents infinity for floating-point values, i.e.,  dfs. getInfinity() 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    Number syntax

    可以通过以下正则表达式语法来指定可由该类的实例解析为数字的字符串,其中Rmax是所使用的基数中的最高位(例如,基数10中的 Rmax 是9)。

    NonAsciiDigit : 
    非ASCII字符c, Character.isDigit (c)返回true 
    
    Non0Digit[1- Rmax ] | NonASCIIDigit 
    
    数字 : 
    [0- Rmax ] | NonASCIIDigit 
    
    GroupedNumeral(  Non0Digit Digit ? Digit ? 
    (  LocalGroupSeparator 数字 位 数字 )+ ) 
    
    数字 : 
    ( ( 数字 + ) | GroupedNumeral ) 
    
    Integer: 
    ( [-+]? ( 数字 ) ) 
    | LocalPositivePrefix 数字 LocalPositiveSuffix 
    | LocalNegativePrefix 数字 LocalNegativeSuffix 
    
    十进制数 : 
    数字 
    | 数字 LocalDecimalSeparator 数字 * 
    | LocalDecimalSeparator 数字 + 
    
    指数 : 
    ( [eE] [+-]? 数字 + ) 
    
    Decimal: 
    ( [-+]? DecimalNumeral 指数 ? ) 
    | LocalPositivePrefix DecimalNumeral LocalPositiveSuffix Exponent ? 
    | LocalNegativePrefix DecimalNumeral LocalNegativeSuffix Exponent ? 
    
    HexFloat[-+]? 0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+ ([pP][-+]?[0-9]+)? 
    
    非数字 : 
    NaN | LocalNan | Infinity | LocalInfinity 
    
    SignedNonNumber( [-+]? NonNumber ) 
    | LocalPositivePrefix NonNumber LocalPositiveSuffix 
    | LocalNegativePrefix NonNumber LocalNegativeSuffix 
    
    Float : 
    十进制 | HexFloat | SignedNonNumber 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    在上述正则表达式中,空格并不重要。

    从以下版本开始:
    1.5

    2、构造方法摘要

    2.1 File source

    构造一个新的 Scanner ,它生成从指定文件扫描的值。

    2.2 File source, String charsetName

    构造一个新的 Scanner ,它生成从指定文件扫描的值。

    2.3 File source, Charset charset

    构造一个新的 Scanner ,它生成从指定文件扫描的值。

    2.4 InputStream source

    构造一个新的 Scanner ,它生成从指定输入流扫描的值。

    2.5 InputStream source, String charsetName

    构造一个新的 Scanner ,它生成从指定输入流扫描的值。

    2.6 InputStream source, Charset charset

    构造一个新的 Scanner ,它生成从指定输入流扫描的值。

    2.7 Readable source

    构造一个新的 Scanner ,它生成从指定源扫描的值。

    2.8 String source

    构造一个新的 Scanner ,它生成从指定字符串扫描的值。

    2.9 ReadableByteChannel source

    构造一个新的 Scanner ,它可以生成从指定通道扫描的值。

    2.10 ReadableByteChannel source, String charsetName

    构造一个新的 Scanner ,它可以生成从指定通道扫描的值。

    2.11 ReadableByteChannel source, Charset charset

    构造一个新的 Scanner ,它可以生成从指定通道扫描的值。

    2.12 Path source

    构造一个新的 Scanner ,它生成从指定文件扫描的值。

    2.13 Path source, String charsetName

    构造一个新的 Scanner ,它生成从指定文件扫描的值。

    2.14 Path source, Charset charset

    构造一个新的 Scanner ,它生成从指定文件扫描的值。

    3、方法摘要

    3.1 void close()

    关闭此扫描仪。

    3.2 Pattern delimiter()

    返回此 Scanner 当前正在用于匹配分隔符的 Pattern。

    3.3 Stream> findAll​(String patString)

    返回与提供的模式字符串匹配的匹配结果流。

    3.4 Stream findAll​(Pattern pattern)

    返回此扫描程序的匹配结果流。

    3.5 String findInLine​(String pattern)

    试图在忽略分隔符的情况下查找下一个从指定字符串构造的模式。

    3.6 String findInLine​(Pattern pattern)

    试图在忽略分隔符的情况下查找下一个指定模式。

    3.7 String findWithinHorizon​(String pattern, int horizon)

    试图在忽略分隔符的情况下查找下一个从指定字符串构造的模式。

    3.8 String findWithinHorizon​(Pattern pattern, int horizon)

    试图查找下一个指定模式。

    3.9 boolean hasNext()

    如果此扫描器的输入中有另一个标记,则返回 true。

    3.10 boolean hasNext​(String pattern)

    如果下一个标记与从指定字符串构造的模式匹配,则返回 true。

    3.11 boolean hasNext​(Pattern pattern)

    如果下一个完整标记与指定模式匹配,则返回true。

    3.12 boolean hasNextBigDecimal()

    如果此扫描器输入中的下一个标记可以使用 nextBigDecimal()解释为 BigDecimal,则返回true。

    3.13 boolean hasNextBigInteger()

    如果此扫描器输入中的下一个标记可以使用 nextBigInteger()在默认基数中解释为 BigInteger ,则返回true。

    3.14 boolean hasNextBigInteger​(int radix)

    如果此扫描器输入中的下一个标记可以使用 nextBigInteger()在指定的基数中解释为 BigInteger ,则返回true。

    3.15 boolean hasNextBoolean()

    如果使用从字符串“true | false”创建的不区分大小写的模式,可以将此扫描器输入中的下一个标记解释为布尔值,则返回true。

    3.16 boolean hasNextByte()

    如果使用 nextByte()将此扫描器输入中的下一个标记解释为默认基数中的字节值,则返回true。

    3.17 boolean hasNextByte​(int radix)

    如果使用 nextByte()将此扫描器输入中的下一个标记解释为指定基数中的字节值,则返回true。

    3.18 boolean hasNextDouble()

    如果使用 nextDouble()将此扫描仪输入中的下一个标记解释为double值,则返回true。

    3.19 boolean hasNextFloat()

    如果使用 nextFloat()将此扫描器输入中的下一个标记解释为浮点值,则返回true。

    3.20 boolean hasNextInt()

    如果使用 nextInt()将此扫描器输入中的下一个标记解释为默认基数中的int值,则返回true。

    3.21 boolean hasNextInt​(int radix)

    如果此扫描器输入中的下一个标记可以使用 nextInt()解释为指定基数中的int值,则返回true。

    3.22 boolean hasNextLine()

    如果此扫描器的输入中有另一行,则返回true。

    3.23 boolean hasNextLong()

    如果使用 nextLong()将此扫描器输入中的下一个标记解释为默认基数中的长值,则返回true。

    3.24 boolean hasNextLong​(int radix)

    如果使用 nextLong()可以将此扫描器输入中的下一个标记解释为指定基数中的长值,则返回true。

    3.25 boolean hasNextShort()

    如果使用 nextShort()可以将此扫描器输入中的下一个标记解释为默认基数中的短值,则返回true。

    3.26 boolean hasNextShort​(int radix)

    如果此扫描器输入中的下一个标记可以使用 nextShort()解释为指定基数中的短值,则返回true。

    3.27 IOException ioException()

    返回 IOException,最后通过此抛出 Scanner的基本 Readable 。

    3.28 Locale locale()

    返回此扫描程序的语言环境。

    3.29 MatchResult match()

    返回此扫描程序执行的上次扫描操作的匹配结果。

    3.30 String next()

    从此扫描仪查找并返回下一个完整令牌。

    3.31 String next​(String pattern)

    如果它与从指定字符串构造的模式匹配,则返回下一个标记。

    3.32 String next​(Pattern pattern)

    如果匹配指定的模式,则返回下一个标记。

    3.33 BigDecimal nextBigDecimal()

    将输入的下一个标记扫描为BigDecimal 。

    3.34 BigInteger nextBigInteger()

    将输入的下一个标记扫描为BigInteger 。

    3.35 BigInteger nextBigInteger​(int radix)

    将输入的下一个标记扫描为BigInteger 。

    3.36 boolean nextBoolean()

    将输入的下一个标记扫描为布尔值并返回该值。

    3.37 byte nextByte()

    将输入的下一个标记扫描为 byte 。

    3.38 byte nextByte​(int radix)

    将输入的下一个标记扫描为 byte 。

    3.39 double nextDouble()

    将输入的下一个标记扫描为 double 。

    3.40 float nextFloat()

    将输入的下一个标记扫描为 float 。

    3.41 int nextInt()

    将输入的下一个标记扫描为 int 。

    3.42 int nextInt​(int radix)

    将输入的下一个标记扫描为 int 。

    3.43 String nextLine()

    使此扫描器前进超过当前行并返回跳过的输入。

    3.44 long nextLong()

    将输入的下一个标记扫描为 long 。

    3.45 long nextLong​(int radix)

    将输入的下一个标记扫描为 long 。

    3.46 short nextShort()

    将输入的下一个标记扫描为 short 。

    3.47 short nextShort​(int radix)

    将输入的下一个标记扫描为 short 。

    3.48 int radix()

    返回此扫描器的默认基数。

    3.49 void remove()

    Iterator的此实现不支持删除操作。

    3.50 Scanner reset()

    重置此扫描仪。

    3.51 Scanner skip​(String pattern)

    跳过与指定字符串构造的模式匹配的输入。

    3.52 Scanner skip​(Pattern pattern)

    跳过与指定模式匹配的输入,忽略分隔符。

    3.53 Stream tokens()

    从此扫描程序返回分隔符分隔的标记流。

    3.54 String toString()

    返回此 Scanner的字符串表示 Scanner 。

    3.55 Scanner useDelimiter​(String pattern)

    将此扫描仪的分隔模式设置为从指定的 String构造的模式。

    3.56 Scanner useDelimiter​(Pattern pattern)

    将此扫描仪的分隔模式设置为指定的模式。

    3.57 Scanner useLocale​(Locale locale)

    将此扫描程序的语言环境设置为指定的语言环境。

    3.58 Scanner useRadix​(int radix)

    将此扫描仪的默认基数设置为指定的基数。

    最后

    如果大家需要Java-API文档,我上传了《Java-API文档-包含5/8/11三个版本》。


    本文持续更新中。。。

  • 相关阅读:
    优雅写代码的45个小技巧
    uniapp项目实践总结(十五)使用websocket实现简易聊天室
    (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
    (10)Qt---项目打包
    win10+VS2015编译opencv4.5.1+opencv_contrib+CUDA详细教程
    ES中的三种查询
    android录音mediaRecord\AudioRecord\openSL\PCM tinyalsa总结和优缺点
    打印lua输出日志
    你真的了解Spring的依赖查找吗?
    MySQL面试题:用户金额充值面试题详解
  • 原文地址:https://blog.csdn.net/m0_69908381/article/details/133872926