Module  java.base
软件包  java.util

Class Scanner

  • All Implemented Interfaces:
    CloseableAutoCloseableIterator<String>


    public final class Scanner
    extends Object
    implements Iterator<String>, Closeable
    一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。

    A Scanner使用分隔符模式将其输入打破令牌,默认情况下匹配空格。 然后可以使用各种next方法将得到的令牌转换成不同类型的值。

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

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

    另一个例子,该代码允许从文件myNumbers条目分配long类型:

    
          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
     

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

    
         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();
     

    扫描仪使用的default whitespace delimiter是由Character.isWhitespace()确认的。 reset()方法将将扫描仪分隔符的值重置为默认空格分隔符,而不管以前是否已更改。

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

    next()hasNext()方法及其配套方法(例如nextInt()hasNextInt() )首先跳过与分隔符模式匹配的任何输入,然后尝试返回下一个令牌。 hasNext()next()方法都可能会阻止等待进一步的输入。 一个hasNext()方法块是否没有连接到其关联的next()方法是否会阻塞。 tokens()方法也可能会阻止等待输入。

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

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

    根据定界模式的类型,可以返回空的令牌。 例如,模式"\\s+"将不返回空的令牌,因为它符合分隔符的多个实例。 定界模式"\\s"可以返回空令牌,因为它只能一次传递一个空格。

    扫描仪可以从实现Readable接口的任何对象读取文本。 如果底层可读的read()方法的调用会抛出一个IOException则扫描器会假定输入的结尾已经到达。 底层可读的抛出最新的IOException可以通过ioException()方法检索。

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

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

    除非另有提及,传递null参数成的任何方法Scanner将导致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()

    Number syntax

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

    NonAsciiDigit
    一个非ASCII字符c,其中Character.isDigit (c)返回true
    Non0Digit
    [1- Rmax ] | NonASCIIDigit
    数字
    [0- Rmax ] | NonASCIIDigit
    分组数
    Non0Digit Digit ? 数字 ?
    LocalGroupSeparator Digit Digit Digit )+ )
    数字
    ( ( 数字 + ) | GroupedNumeral )
    Integer:
    ( [-+]? ( 数字 ) )
    | LocalPositivePrefix 数字 LocalPositiveSuffix
    | LocalNegativePrefix 数字 LocalNegativeSuffix
    小数点数
    数字
    | 数字 LocalDecimalSeparator 数字 *
    | LocalDecimalSeparator Digit +
    指数
    ( [eE] [+-]? 数字 + )
    Decimal:
    ( [-+]? 小数 指数 ? )
    | LocalPositivePrefix DecimalNumeral LocalPositiveSuffix 指数 ?
    | LocalNegativePrefix DecimalNumeral LocalNegativeSuffix 指数 ?
    HexFloat
    [-+]? 0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+ ([pP][-+]?[0-9]+)?
    非数字
    NaN | LocalNan | Infinity | LocalInfinity
    签名号
    ( [-+]? NonNumber )
    | LocalPositivePrefix NonNumber LocalPositiveSuffix
    | LocalNegativePrefix NonNumber LocalNegativeSuffix
    Float
    十进制 | HexFloat | 签名 | 参数

    上述正则表达式中的空格不重要。

    从以下版本开始:
    1.5
    • 构造方法摘要

      构造方法  
      Constructor 描述
      Scanner​(File source)
      构造一个新的 Scanner ,产生从指定文件扫描的值。
      Scanner​(File source, String charsetName)
      构造一个新的 Scanner ,产生从指定文件扫描的值。
      Scanner​(InputStream source)
      构造一个新的 Scanner ,产生从指定的输入流扫描的值。
      Scanner​(InputStream source, String charsetName)
      构造一个新的 Scanner ,产生从指定的输入流扫描的值。
      Scanner​(Readable source)
      构造一个新的 Scanner ,产生从指定源扫描的值。
      Scanner​(String source)
      构造一个新的 Scanner ,产生从指定字符串扫描的值。
      Scanner​(ReadableByteChannel source)
      构造一个新的 Scanner ,产生从指定通道扫描的值。
      Scanner​(ReadableByteChannel source, String charsetName)
      构造一个新的 Scanner ,产生从指定通道扫描的值。
      Scanner​(Path source)
      构造一个新的 Scanner ,产生从指定文件扫描的值。
      Scanner​(Path source, String charsetName)
      构造一个新的 Scanner ,产生从指定文件扫描的值。
    • 方法摘要

      所有方法  接口方法  具体的方法 
      Modifier and Type 方法 描述
      void close​()
      关闭此扫描仪。
      Pattern delimiter​()
      返回 Pattern这个 Scanner当前用于匹配分隔符。
      Stream<MatchResult> findAll​(String patString)
      返回与提供的模式字符串相匹配的匹配结果流。
      Stream<MatchResult> findAll​(Pattern pattern)
      返回此扫描仪的匹配结果流。
      String findInLine​(String pattern)
      尝试查找从指定字符串构造的模式的下一个出现,忽略分隔符。
      String findInLine​(Pattern pattern)
      尝试找到忽略分隔符的指定模式的下一个出现。
      String findWithinHorizon​(String pattern, int horizon)
      尝试查找从指定字符串构造的模式的下一个出现,忽略分隔符。
      String findWithinHorizon​(Pattern pattern, int horizon)
      尝试找到指定模式的下一个出现。
      boolean hasNext​()
      如果此扫描仪在其输入中有另一个令牌,则返回true。
      boolean hasNext​(String pattern)
      如果下一个令牌匹配从指定字符串构造的模式,则返回true。
      boolean hasNext​(Pattern pattern)
      如果下一个完整的令牌匹配指定的模式,则返回true。
      boolean hasNextBigDecimal​()
      如果此扫描仪输入中的下一个标记可以使用 nextBigDecimal()方法解释为 BigDecimal则返回true。
      boolean hasNextBigInteger​()
      如果此扫描仪输入中的下一个标记可以使用 nextBigInteger()方法将其解释为默认基数中的 BigInteger ,则返回true。
      boolean hasNextBigInteger​(int radix)
      如果此扫描仪输入中的下一个标记可以使用 nextBigInteger()方法将其解释为指定基数中的 BigInteger ,则返回true。
      boolean hasNextBoolean​()
      如果此扫描器输入中的下一个标记可以使用从字符串“true | false”创建的不区分大小写的模式解释为布尔值,则返回true。
      boolean hasNextByte​()
      如果此扫描仪输入中的下一个标记可以使用 nextByte()方法将其解释为默认基数中的字节值,则返回true。
      boolean hasNextByte​(int radix)
      如果此扫描仪输入中的下一个标记可以使用 nextByte()方法将其解释为指定基数中的字节值,则返回true。
      boolean hasNextDouble​()
      如果该扫描仪输入中的下一个标记可以使用 nextDouble()方法将其解释为双重值,则返回true。
      boolean hasNextFloat​()
      如果此扫描仪输入中的下一个标记可以使用 nextFloat()方法将其解释为浮点值,则返回true。
      boolean hasNextInt​()
      如果此扫描仪输入中的下一个标记可以使用 nextInt()方法将其解释为默认基数中的int值,则返回true。
      boolean hasNextInt​(int radix)
      如果扫描仪的输入中的下一个标记可以使用 nextInt()方法解释为指定基数中的int值,则返回true。
      boolean hasNextLine​()
      如果扫描仪的输入中有另一行,则返回true。
      boolean hasNextLong​()
      如果此扫描仪的输入中的下一个令牌可以使用 nextLong()方法将其解释为默认基数中的长值,则返回true。
      boolean hasNextLong​(int radix)
      如果此扫描仪输入中的下一个标记可以使用 nextLong()方法将其解释为指定基数中的长 整型值,则返回true。
      boolean hasNextShort​()
      如果此扫描仪输入中的下一个标记可以使用 nextShort()方法将其解释为默认基数中的一个短值,则返回true。
      boolean hasNextShort​(int radix)
      如果此扫描仪输入中的下一个标记可以使用 nextShort()方法将其解释为指定基数中的一个短值,则返回true。
      IOException ioException​()
      返回 IOException最后通过此抛出 Scanner的基本 Readable
      Locale locale​()
      返回此扫描仪的区域设置。
      MatchResult match​()
      返回此扫描仪执行的最后扫描操作的匹配结果。
      String next​()
      查找并返回此扫描仪的下一个完整令牌。
      String next​(String pattern)
      如果匹配从指定字符串构造的模式,则返回下一个令牌。
      String next​(Pattern pattern)
      如果匹配指定的模式,则返回下一个令牌。
      BigDecimal nextBigDecimal​()
      将输入的下一个标记扫描为BigDecimal
      BigInteger nextBigInteger​()
      将输入的下一个标记扫描为BigInteger
      BigInteger nextBigInteger​(int radix)
      将输入的下一个标记扫描为BigInteger
      boolean nextBoolean​()
      将输入的下一个标记扫描为布尔值,并返回该值。
      byte nextByte​()
      将输入的下一个标记扫描为 byte
      byte nextByte​(int radix)
      将输入的下一个标记扫描为 byte
      double nextDouble​()
      将输入的下一个标记扫描为 double
      float nextFloat​()
      将输入的下一个标记扫描为 float
      int nextInt​()
      将输入的下一个标记扫描为 int
      int nextInt​(int radix)
      将输入的下一个标记扫描为 int
      String nextLine​()
      将此扫描仪推进到当前行并返回跳过的输入。
      long nextLong​()
      将输入的下一个标记扫描为 long
      long nextLong​(int radix)
      将输入的下一个标记扫描为 long
      short nextShort​()
      将输入的下一个标记扫描为 short
      short nextShort​(int radix)
      将输入的下一个标记扫描为 short
      int radix​()
      返回此扫描仪的默认基数。
      void remove​()
      Iterator的此实现不支持删除操作。
      Scanner reset​()
      重设此扫描仪。
      Scanner skip​(String pattern)
      跳过与指定字符串构成的模式匹配的输入。
      Scanner skip​(Pattern pattern)
      跳过与指定模式匹配的输入,忽略分隔符。
      Stream<String> tokens​()
      从此扫描仪返回一个分隔符的分隔符号流。
      String toString​()
      返回此 Scanner的字符串表示 Scanner
      Scanner useDelimiter​(String pattern)
      将此扫描仪的分隔模式设置为从指定的 String构造的模式。
      Scanner useDelimiter​(Pattern pattern)
      将此扫描仪的分隔模式设置为指定的模式。
      Scanner useLocale​(Locale locale)
      将此扫描仪的区域设置设置为指定的区域设置。
      Scanner useRadix​(int radix)
      将此扫描仪的默认基数设置为指定的基数。
    • 构造方法详细信息

      • Scanner

        public Scanner​(Readable source)
        构造新的 Scanner ,产生从指定源扫描的值。
        参数
        source - 实现Readable界面的字符源
      • Scanner

        public Scanner​(InputStream source)
        构造一个新的Scanner ,产生从指定的输入流扫描的值。 流中的字节将使用底层平台的default charset转换为字符。
        参数
        source - 要扫描的输入流
      • Scanner

        public Scanner​(InputStream source,
                       String charsetName)
        构造一个新的Scanner ,产生从指定的输入流扫描的值。 流中的字节将使用指定的字符集转换为字符。
        参数
        source - 要扫描的输入流
        charsetName - 用于将流中的字节转换为要扫描的字符的编码类型
        异常
        IllegalArgumentException - 如果指定的字符集不存在
      • Scanner

        public Scanner​(File source,
                       String charsetName)
                throws FileNotFoundException
        构造一个新的Scanner ,产生从指定文件扫描的值。 使用指定的字符集将文件中的字节转换为字符。
        参数
        source - 要扫描的文件
        charsetName - 用于将文件中的字节转换为要扫描的字符的编码类型
        异常
        FileNotFoundException - 如果找不到源
        IllegalArgumentException - 如果未找到指定的编码
      • Scanner

        public Scanner​(Path source)
                throws IOException
        构造一个新的Scanner ,产生从指定文件扫描的值。 文件中的字节将使用底层平台的default charset转换为字符。
        参数
        source - 要扫描的文件的路径
        异常
        IOException - 如果I / O错误发生开源
        从以下版本开始:
        1.7
      • Scanner

        public Scanner​(Path source,
                       String charsetName)
                throws IOException
        构造一个新的Scanner ,产生从指定文件扫描的值。 使用指定的字符集将文件中的字节转换为字符。
        参数
        source - 要扫描的文件的路径
        charsetName - 用于将文件中的字节转换为要扫描的字符的编码类型
        异常
        IOException - 如果I / O错误发生开源
        IllegalArgumentException - 如果未找到指定的编码
        从以下版本开始:
        1.7
      • Scanner

        public Scanner​(String source)
        构造一个新的 Scanner ,产生从指定字符串扫描的值。
        参数
        source - 要扫描的字符串
      • Scanner

        public Scanner​(ReadableByteChannel source)
        构造一个新的Scanner ,产生从指定通道扫描的值。 源码中的字节将使用底层平台的default charset转换为字符。
        参数
        source - 要扫描的频道
      • Scanner

        public Scanner​(ReadableByteChannel source,
                       String charsetName)
        构造新的Scanner ,产生从指定通道扫描的值。 来自源的字节将使用指定的字符集转换为字符。
        参数
        source - 要扫描的频道
        charsetName - 用于将字节从通道转换为要扫描的字符的编码类型
        异常
        IllegalArgumentException - 如果指定的字符集不存在
    • 方法详细信息

      • close

        public void close​()
        关闭此扫描仪。

        如果该扫描仪尚未关闭,那么如果其底层的readable也实现了Closeable接口,那么可读的close方法将被调用。 如果此扫描仪已关闭,则调用此方法将不起作用。

        扫描仪关闭后尝试执行搜索操作将导致IllegalStateException

        Specified by:
        close在接口 AutoCloseable
        Specified by:
        close在接口 Closeable
      • ioException

        public IOException ioException​()
        返回IOException最后通过此抛出Scanner的基本Readable 如果不存在这种异常,此方法返回null
        结果
        这个扫描仪可读的抛出的最后一个异常
      • delimiter

        public Pattern delimiter​()
        返回 Pattern这个 Scanner当前正在使用来匹配分隔符。
        结果
        这个扫描仪的划分模式。
      • useDelimiter

        public Scanner useDelimiter​(Pattern pattern)
        将此扫描仪的分隔模式设置为指定的模式。
        参数
        pattern - 定界模式
        结果
        这个扫描仪
      • useDelimiter

        public Scanner useDelimiter​(String pattern)
        将此扫描仪的分隔模式设置为从指定的String构造的模式。

        对这种useDelimiter(pattern)形式的方法的调用与调用useDelimiter(Pattern.compile(pattern))

        调用reset()方法将扫描仪的分隔符设置为default

        参数
        pattern - 指定定界模式的字符串
        结果
        这个扫描仪
      • locale

        public Locale locale​()
        返回此扫描仪的区域设置。

        扫描仪的区域设置会影响其默认基元匹配正则表达式的许多元素; 见上面的localized numbers

        结果
        这个扫描仪的区域设置
      • useLocale

        public Scanner useLocale​(Locale locale)
        将此扫描仪的区域设置设置为指定的区域设置。

        扫描仪的区域设置会影响其默认基元匹配正则表达式的许多元素; 见上面的localized numbers

        调用reset()方法将扫描仪的区域设置设置为initial locale

        参数
        locale - 指定要使用的区域设置的字符串
        结果
        这个扫描仪
      • radix

        public int radix​()
        返回此扫描仪的默认基数。

        扫描仪的基数影响与正则表达式匹配的默认数字的元素; 见上面的localized numbers

        结果
        该扫描仪的默认基数
      • useRadix

        public Scanner useRadix​(int radix)
        将此扫描仪的默认基数设置为指定的基数。

        扫描仪的基数影响与正则表达式匹配的默认数字的元素; 见上面的localized numbers

        如果基数小于Character.MIN_RADIX或大于Character.MAX_RADIX ,则抛出IllegalArgumentException

        调用reset()方法将扫描仪的基数设置为10

        参数
        radix - 扫描数字时使用的基数
        结果
        这个扫描仪
        异常
        IllegalArgumentException - 如果基数超出范围
      • match

        public MatchResult match​()
        返回此扫描仪执行的最后扫描操作的匹配结果。 如果未执行任何匹配,或者最后一次匹配IllegalStateException则此方法将抛出IllegalStateException

        各种next的方法Scanner使比赛结果可用,如果他们完成未抛出异常。 例如,在调用返回int的nextInt()方法之后,此方法返回一个MatchResult用于搜索上述定义的Integer正则表达式。 同样, findInLine()findWithinHorizon() ,并skip()方法将一个匹配结果,如果他们取得成功。

        结果
        最后一场比赛的比赛结果
        异常
        IllegalStateException - 如果没有匹配结果可用
      • toString

        public String toString​()

        返回此Scanner的字符串表示Scanner Scanner的字符串表示Scanner包含可能对调试有用的信息。 确切的格式是未指定的。

        重写:
        toStringObject
        结果
        该扫描仪的字符串表示
      • hasNext

        public boolean hasNext​()
        如果此扫描仪在其输入中有另一个令牌,则返回true。 此方法可能会在等待输入扫描时屏蔽。 扫描仪不会超过任何输入。
        Specified by:
        hasNext在接口 Iterator<String>
        结果
        当且仅当该扫描仪具有另一个令牌时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
        另请参见:
        Iterator
      • next

        public String next​()
        查找并返回此扫描仪的下一个完整令牌。 一个完整的令牌在分隔符模式之前和之后是与分隔符模式匹配的输入。 此方法可能会在等待输入扫描时阻塞,即使以前的调用hasNext()返回true
        Specified by:
        next在接口 Iterator<String>
        结果
        下一个标记
        异常
        NoSuchElementException - 如果没有更多的令牌可用
        IllegalStateException - 如果此扫描仪已关闭
        另请参见:
        Iterator
      • hasNext

        public boolean hasNext​(String pattern)
        如果下一个令牌匹配从指定字符串构造的模式,则返回true。 扫描仪不会超过任何输入。

        这种hasNext(pattern)形式的方法的调用与调用hasNext(Pattern.compile(pattern))

        参数
        pattern - 指定要扫描的模式的字符串
        结果
        如果且仅当此扫描仪具有与指定模式匹配的另一个令牌,则为true
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • next

        public String next​(String pattern)
        如果匹配从指定字符串构造的模式,则返回下一个令牌。 如果匹配成功,扫描仪将超过符合图案的输入。

        对这种next(pattern)形式的方法的调用与调用next(Pattern.compile(pattern))

        参数
        pattern - 指定要扫描的模式的字符串
        结果
        下一个标记
        异常
        NoSuchElementException - 如果没有这样的令牌可用
        IllegalStateException - 如果此扫描仪已关闭
      • hasNext

        public boolean hasNext​(Pattern pattern)
        如果下一个完整的令牌匹配指定的模式,则返回true。 完整的令牌前缀并通过与分隔符模式匹配的输入进行后缀。 此方法可能会在等待输入时阻塞。 扫描仪不会超过任何输入。
        参数
        pattern - 要扫描的图案
        结果
        如果且仅当此扫描仪具有与指定模式匹配的另一个令牌,则为true
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • next

        public String next​(Pattern pattern)
        如果匹配指定的模式,则返回下一个令牌。 此方法可能会在等待输入扫描时阻塞,即使以前的调用hasNext(Pattern)返回true 如果匹配成功,扫描仪将超过符合图案的输入。
        参数
        pattern - 要扫描的模式
        结果
        下一个标记
        异常
        NoSuchElementException - 如果没有更多的令牌可用
        IllegalStateException - 如果此扫描仪已关闭
      • hasNextLine

        public boolean hasNextLine​()
        如果扫描仪的输入中有另一行,则返回true。 此方法可能会在等待输入时阻塞。 扫描仪不会超过任何输入。
        结果
        当且仅当此扫描仪具有另一行输入时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • nextLine

        public String nextLine​()
        将此扫描仪推进到当前行并返回跳过的输入。 此方法返回当前行的其余部分,不包括末尾的任何行分隔符。 该位置设置为下一行的开头。

        由于该方法继续搜索通过输入寻找行分隔符的输入,所以如果不存在行分隔符,它可以缓冲所有搜索行的输入,以跳过。

        结果
        被跳过的行
        异常
        NoSuchElementException - 如果没有找到行
        IllegalStateException - 如果此扫描仪已关闭
      • findInLine

        public String findInLine​(String pattern)
        尝试查找从指定字符串构造的模式的下一个出现,忽略分隔符。

        对这种findInLine(pattern)形式的方法的调用与调用findInLine(Pattern.compile(pattern))

        参数
        pattern - 指定要搜索的模式的字符串
        结果
        匹配指定模式的文本
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • findInLine

        public String findInLine​(Pattern pattern)
        尝试找到忽略分隔符的指定模式的下一个出现。 如果在下一行分隔符之前找到模式,则扫描器将超过匹配的输入,并返回与模式匹配的字符串。 如果在直到下一行分隔符的输入中没有检测到这种模式,则返回null ,扫描仪的位置不变。 此方法可能会阻止等待与模式匹配的输入。

        由于该方法继续搜索输入寻找指定的模式,所以如果不存在线分隔符,它可能会缓冲搜索所需令牌的所有输入。

        参数
        pattern - 要扫描的模式
        结果
        匹配指定模式的文本
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • findWithinHorizon

        public String findWithinHorizon​(String pattern,
                                        int horizon)
        尝试查找从指定字符串构造的模式的下一个出现,忽略分隔符。

        这种findWithinHorizon(pattern)形式的方法的调用方式与调用findWithinHorizon(Pattern.compile(pattern), horizon)

        参数
        pattern - 指定要搜索的模式的字符串
        horizon - 搜索范围
        结果
        匹配指定模式的文本
        异常
        IllegalStateException - 如果此扫描仪已关闭
        IllegalArgumentException - 如果地平线是负的
      • findWithinHorizon

        public String findWithinHorizon​(Pattern pattern,
                                        int horizon)
        尝试找到指定模式的下一个出现。

        该方法通过输入搜索直到指定的搜索范围,忽略分隔符。 如果找到模式,扫描仪将超过匹配的输入,并返回匹配该模式的字符串。 如果没有检测到这种模式,则返回null,扫描仪的位置保持不变。 此方法可能会阻止等待与模式匹配的输入。

        扫描仪永远不会搜索超过其当前位置的horizon代码点。 请注意,比赛可能会被地平线所限制; 也就是说,如果地平线较大,任意匹配结果可能不同。 扫描仪将地平线视为透明的非锚定界限(见Matcher.useTransparentBounds(boolean)Matcher.useAnchoringBounds(boolean) )。

        如果地平线是0 ,那么地平线将被忽略,并且该方法继续搜索通过输入寻找指定的模式而不受约束。 在这种情况下,它可以缓冲搜索模式的所有输入。

        如果地平线为负,则抛出IllegalArgumentException。

        参数
        pattern - 要扫描的模式
        horizon - 搜索范围
        结果
        匹配指定模式的文本
        异常
        IllegalStateException - 如果此扫描仪已关闭
        IllegalArgumentException - 如果地平线是负的
      • skip

        public Scanner skip​(Pattern pattern)
        跳过与指定模式匹配的输入,忽略分隔符。 如果指定模式的锚定匹配成功,此方法将跳过输入。

        如果在当前位置找不到指定模式的匹配项,则不跳过任何输入,并抛出NoSuchElementException

        由于该方法旨在匹配从扫描仪当前位置开始的指定模式,因此可以匹配大量输入(例如“。*”)的模式可能会导致扫描程序缓冲大量输入。

        请注意,通过使用可以匹配的模式,例如sc.skip("[ \t]*") ,可以跳过某些东西而不冒NoSuchElementException的风险。

        参数
        pattern - 指定要跳过的模式的字符串
        结果
        这个扫描仪
        异常
        NoSuchElementException - 如果未找到指定的模式
        IllegalStateException - 如果此扫描仪已关闭
      • skip

        public Scanner skip​(String pattern)
        跳过与指定字符串构成的模式匹配的输入。

        这种skip(pattern)形式的方法的调用与调用skip(Pattern.compile(pattern))

        参数
        pattern - 指定要跳过的模式的字符串
        结果
        这个扫描仪
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • hasNextBoolean

        public boolean hasNextBoolean​()
        如果此扫描器输入中的下一个标记可以使用从字符串“true | false”创建的不区分大小写的模式解释为布尔值,则返回true。 扫描仪不会超过匹配的输入。
        结果
        当且仅当此扫描器的下一个令牌是有效的布尔值时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • nextBoolean

        public boolean nextBoolean​()
        将输入的下一个标记扫描为布尔值,并返回该值。 如果下一个令牌无法转换为有效的布尔值,此方法将抛出InputMismatchException 如果匹配成功,扫描仪将超过匹配的输入。
        结果
        从输入中扫描的布尔值
        异常
        InputMismatchException - 如果下一个令牌不是有效的布尔值
        NoSuchElementException - 输入是否耗尽
        IllegalStateException - 如果此扫描仪已关闭
      • hasNextByte

        public boolean hasNextByte​()
        如果扫描仪输入中的下一个标记可以使用nextByte()方法将其解释为默认基数中的字节值,则返回true。 扫描仪不会超过任何输入。
        结果
        当且仅当此扫描仪的下一个令牌是有效的字节值时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • hasNextByte

        public boolean hasNextByte​(int radix)
        如果此扫描仪输入中的下一个标记可以使用nextByte()方法解释为指定基数中的字节值,则返回true。 扫描仪不会超过任何输入。

        如果基数小于Character.MIN_RADIX或大于Character.MAX_RADIX ,则抛出IllegalArgumentException

        参数
        radix - 用于将令牌解释为字节值的基数
        结果
        当且仅当此扫描仪的下一个令牌是有效的字节值时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
        IllegalArgumentException - 如果基数超出范围
      • nextByte

        public byte nextByte​()
        将输入的下一个标记扫描为byte

        对这种nextByte()形式的方法的调用与调用nextByte(radix) ,其中radix是该扫描器的默认基数。

        结果
        byte从输入扫描
        异常
        InputMismatchException - 如果下一个令牌与 整数正则表达式不匹配,或超出范围
        NoSuchElementException - 如果输入已用尽
        IllegalStateException - 如果此扫描仪已关闭
      • nextByte

        public byte nextByte​(int radix)
        将输入的下一个标记扫描为byte 如果下一个令牌不能转换为有效的字节值,则此方法将抛出InputMismatchException ,如下所述。 如果翻译成功,扫描仪将超过匹配的输入。

        如果下一个令牌符合上面定义的270644548965050正则表达式,则令牌将转换为byte值,如同通过删除所有特定于语言环境的前缀,组分隔符和特定于语言环境的后缀一样,然后通过Character.digit将非ASCII数字映射为ASCII数字如果存在特定的区域设置的前缀和后缀,则使用负号( - ),并将结果字符串传递给具有指定基数的Byte.parseByte

        如果基数小于Character.MIN_RADIX或大于Character.MAX_RADIX ,则抛出IllegalArgumentException

        参数
        radix - 用于将令牌解释为字节值的基数
        结果
        byte从输入扫描
        异常
        InputMismatchException - 如果下一个令牌与 整数正则表达式不匹配或超出范围
        NoSuchElementException - 输入是否耗尽
        IllegalStateException - 如果此扫描仪已关闭
        IllegalArgumentException - 如果基数超出范围
      • hasNextShort

        public boolean hasNextShort​()
        如果此扫描仪输入中的下一个标记可以使用nextShort()方法将其解释为默认基数中的短值,则返回true。 扫描仪不会超过任何输入。
        结果
        当且仅当此扫描仪的下一个标记是默认基数中的有效短值时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • hasNextShort

        public boolean hasNextShort​(int radix)
        如果此扫描仪输入中的下一个标记可以使用nextShort()方法将其解释为指定基数中的一个短值,则返回true。 扫描仪不会超过任何输入。

        如果基数小于Character.MIN_RADIX或大于Character.MAX_RADIX ,则抛出IllegalArgumentException

        参数
        radix - 用于将令牌解释为短值的基数
        结果
        当且仅当此扫描器的下一个标记是指定基数中的有效的短值时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
        IllegalArgumentException - 如果基数超出范围
      • nextShort

        public short nextShort​(int radix)
        将输入的下一个标记扫描为short 如果下一个令牌不能转换为有效的短值,则此方法将抛出InputMismatchException ,如下所述。 如果翻译成功,扫描仪将超过匹配的输入。

        如果下一个令牌符合上述定义的27064454993838正则表达式,则令牌将转换为short值,如同通过删除所有特定于语言环境的前缀,组分隔符和特定于语言环境的后缀一样,然后通过Character.digit将非ASCII数字映射为ASCII数字, 前缀为如果区域设置特定的负前缀和后缀存在,并将结果字符串传递到具有指定基数的Short.parseShort则为负号( - )。

        如果基数小于Character.MIN_RADIX或大于Character.MAX_RADIX ,则抛出IllegalArgumentException

        参数
        radix - 用于将令牌解释为短值的基数
        结果
        short从输入扫描
        异常
        InputMismatchException - 如果下一个令牌与 整型正则表达式不匹配,或超出范围
        NoSuchElementException - 输入是否耗尽
        IllegalStateException - 如果此扫描仪已关闭
        IllegalArgumentException - 如果基数超出范围
      • hasNextInt

        public boolean hasNextInt​()
        如果此扫描仪输入中的下一个标记可以使用nextInt()方法将其解释为默认基数中的int值,则返回true。 扫描仪不会超过任何输入。
        结果
        当且仅当此扫描器的下一个令牌是有效的int值时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • hasNextInt

        public boolean hasNextInt​(int radix)
        如果此扫描仪的输入中的下一个标记可以使用nextInt()方法解释为指定基数中的int值,则返回true。 扫描仪不会超过任何输入。

        如果基数小于Character.MIN_RADIX或大于Character.MAX_RADIX ,则抛出IllegalArgumentException

        参数
        radix - 用于将令牌解释为int值的基数
        结果
        当且仅当此扫描器的下一个令牌是有效的int值时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
        IllegalArgumentException - 如果基数超出范围
      • nextInt

        public int nextInt​()
        将输入的下一个标记扫描为int

        调用nextInt()形式的方法与调用nextInt(radix) ,其中radix是此扫描程序的默认基数。

        结果
        int从输入扫描
        异常
        InputMismatchException - 如果下一个令牌与 整数正则表达式不匹配,或超出范围
        NoSuchElementException - 如果输入已用尽
        IllegalStateException - 如果此扫描仪已关闭
      • nextInt

        public int nextInt​(int radix)
        将输入的下一个标记扫描为int 如果下一个令牌不能转换为有效的int值,则此方法将抛出InputMismatchException ,如下所述。 如果翻译成功,扫描仪将超过匹配的输入。

        如果下一个令牌符合上面定义的Integer正则表达式,则令牌将转换为int值,就像删除所有特定于语言环境的前缀,组分隔符和特定于语言环境的后缀一样,然后通过Character.digit将非ASCII数字映射为ASCII数字如果存在特定区域的负号前缀和后缀,则使用负号( - ),并将结果字符串传递给具有指定基数的Integer.parseInt

        如果基数小于Character.MIN_RADIX或大于Character.MAX_RADIX ,则抛出IllegalArgumentException

        参数
        radix - 用于将令牌解释为int值的基数
        结果
        int从输入扫描
        异常
        InputMismatchException - 如果下一个令牌与 整数正则表达式不匹配,或超出范围
        NoSuchElementException - 输入是否耗尽
        IllegalStateException - 如果此扫描仪已关闭
        IllegalArgumentException - 如果基数超出范围
      • hasNextLong

        public boolean hasNextLong​()
        如果此扫描仪输入中的下一个标记可以使用nextLong()方法将其解释为默认基数中的长值,则返回true。 扫描仪不会超过任何输入。
        结果
        当且仅当此扫描仪的下一个令牌是有效的长值时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • hasNextLong

        public boolean hasNextLong​(int radix)
        如果此扫描仪输入中的下一个标记可以使用nextLong()方法将其解释为指定基数中的长整型值,则返回true。 扫描仪不会超过任何输入。

        如果基数小于Character.MIN_RADIX或大于Character.MAX_RADIX ,则抛出IllegalArgumentException

        参数
        radix - 用于将令牌解释为长值的基数
        结果
        当且仅当此扫描仪的下一个令牌是有效的长值时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
        IllegalArgumentException - 如果基数超出范围
      • nextLong

        public long nextLong​()
        将输入的下一个标记扫描为long

        这种nextLong()形式的方法的调用与调用nextLong(radix) ,其中radix是该扫描仪的默认基数。

        结果
        long从输入扫描
        异常
        InputMismatchException - 如果下一个令牌不匹配 整数正则表达式,或超出范围
        NoSuchElementException - 如果输入已用尽
        IllegalStateException - 如果此扫描仪已关闭
      • nextLong

        public long nextLong​(int radix)
        将输入的下一个标记扫描为long 如果下一个令牌不能转换为有效的长值,则此方法将抛出InputMismatchException ,如下所述。 如果翻译成功,扫描仪将超过匹配的输入。

        如果下一个令牌匹配上面定义的Integer正则表达式,则令牌将转换为long值,如同通过删除所有特定于语言环境的前缀,组分隔符和特定于语言环境的后缀一样,然后通过Character.digit将非ASCII数字映射为ASCII数字, 前缀为如果存在特定的区域设置的前缀和后缀,则使用负号( - ),并将结果字符串传递给具有指定基数的Long.parseLong

        如果基数小于Character.MIN_RADIX或大于Character.MAX_RADIX ,则抛出IllegalArgumentException

        参数
        radix - 用于将令牌解释为int值的基数
        结果
        long从输入扫描
        异常
        InputMismatchException - 如果下一个标记与 整数正则表达式不匹配,或超出范围
        NoSuchElementException - 如果输入已用尽
        IllegalStateException - 如果此扫描仪已关闭
        IllegalArgumentException - 如果基数超出范围
      • hasNextFloat

        public boolean hasNextFloat​()
        如果此扫描仪输入中的下一个标记可以使用nextFloat()方法将其解释为浮点值,则返回true。 扫描仪不会超过任何输入。
        结果
        当且仅当此扫描仪的下一个令牌是有效的浮点值时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • nextFloat

        public float nextFloat​()
        将输入的下一个标记扫描为float 如果下一个令牌不能转换为有效的浮点值,则此方法将抛出InputMismatchException ,如下所述。 如果翻译成功,扫描仪将超过匹配的输入。

        如果下一个令牌符合上面定义的Float正则表达式,则令牌将转换为float值,如同删除所有特定于语言环境的前缀,组分隔符和特定于语言环境的后缀一样,然后通过Character.digit将非ASCII数字映射为ASCII数字如果存在特定区域的负前缀和后缀,则将负号( - ),并将生成的字符串传递给Float.parseFloat 如果令牌与局部NaN或无穷大字符串匹配,则“Nan”或“Infinity”将酌情传递给Float.parseFloat

        结果
        float从输入扫描
        异常
        InputMismatchException - 如果下一个标记与 Float正则表达式不匹配或超出范围
        NoSuchElementException - 如果输入已用尽
        IllegalStateException - 如果此扫描仪已关闭
      • hasNextDouble

        public boolean hasNextDouble​()
        如果此扫描仪输入中的下一个标记可以使用nextDouble()方法将其解释为双精度值,则返回true。 扫描仪不会超过任何输入。
        结果
        当且仅当此扫描器的下一个令牌是有效的双重值时才为真
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • nextDouble

        public double nextDouble​()
        将输入的下一个标记扫描为double 如果下一个令牌不能转换为有效的双InputMismatchException此方法将抛出InputMismatchException 如果翻译成功,扫描仪将超过匹配的输入。

        如果下一个令牌与上述定义的2706445533830正则表达式匹配,则令牌将转换为double值,如同通过删除所有特定于语言环境的前缀,组分隔符和特定于语言环境的后缀一样,然后通过Character.digit将非ASCII数字映射为ASCII数字如果区域设置特定的负前缀和后缀存在,并将结果字符串传递给Double.parseDouble则为负号( - )。 如果令牌与局部NaN或无穷大字符串匹配,则“Nan”或“Infinity”根据需要传递给Double.parseDouble

        结果
        double从输入扫描
        异常
        InputMismatchException - 如果下一个标记与 Float正则表达式不匹配或超出范围
        NoSuchElementException - 输入是否耗尽
        IllegalStateException - 如果此扫描仪已关闭
      • hasNextBigInteger

        public boolean hasNextBigInteger​()
        如果此扫描仪输入中的下一个令牌可以使用nextBigInteger()方法将其解释为默认基数中的BigInteger ,则返回true。 扫描仪不会超过任何输入。
        结果
        如果且仅当此扫描仪的下一个令牌是有效的 BigInteger
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • hasNextBigInteger

        public boolean hasNextBigInteger​(int radix)
        如果此扫描仪输入中的下一个标记可以使用nextBigInteger()方法解释为指定基数中的BigInteger ,则返回true。 扫描仪不会超过任何输入。

        如果基数小于Character.MIN_RADIX或大于Character.MAX_RADIX ,则抛出IllegalArgumentException

        参数
        radix - 用于将令牌解释为整数的基数
        结果
        如果且仅当此扫描仪的下一个令牌是有效的 BigInteger
        异常
        IllegalStateException - 如果此扫描仪已关闭
        IllegalArgumentException - 如果基数超出范围
      • nextBigInteger

        public BigInteger nextBigInteger​()
        将输入的下一个标记扫描为BigInteger

        对这种nextBigInteger()形式的方法的调用与调用nextBigInteger(radix) ,其中radix是该扫描器的默认基数。

        结果
        BigInteger从输入扫描
        异常
        InputMismatchException - 如果下一个令牌与 整数正则表达式不匹配,或超出范围
        NoSuchElementException - 输入是否耗尽
        IllegalStateException - 如果此扫描仪已关闭
      • hasNextBigDecimal

        public boolean hasNextBigDecimal​()
        如果此扫描仪的输入中的下一个标记可以使用nextBigDecimal()方法解释为BigDecimal则返回true。 扫描仪不会超过任何输入。
        结果
        如果且仅当此扫描仪的下一个令牌是有效的 BigDecimal
        异常
        IllegalStateException - 如果此扫描仪已关闭
      • reset

        public Scanner reset​()
        重设此扫描仪。

        重置扫描器会丢弃所有可能已经通过调用改变了明确的状态信息useDelimiter()useLocale() ,或useRadix()

        对这种scanner.reset()形式的方法的调用与调用的方式完全相同

        
           scanner.useDelimiter("\\p{javaWhitespace}+")
                  .useLocale(Locale.getDefault(Locale.Category.FORMAT))
                  .useRadix(10);
         
        结果
        这个扫描仪
        从以下版本开始:
        1.6
      • tokens

        public Stream<String> tokens​()
        从此扫描仪返回一个分隔符的分隔符号流。 该流包含从该扫描器的当前状态开始返回的相同令牌,通过重复调用next()方法直到hasNext()方法返回false。

        生成的流是顺序的和有序的。 所有流元素都不为空。

        使用该扫描仪的当前状态,在启动终端流操作时开始扫描。 随后调用此扫描仪上除close()ioException()之外的任何方法可能会返回未定义的结果,也可能对返回的流造成未定义的影响。 返回的流的源码Spliterator故障快速的 ,如果在流管道执行期间检测到任何此类呼叫,将尽力而为地抛出一个ConcurrentModificationException

        在流管道执行完成后,该扫描器处于不确定状态,不能重复使用。

        如果此扫描仪包含必须释放的资源,则应关闭此扫描程序,方法是通过调用其close()方法或关闭返回的流。 关闭流将关闭底层扫描程序。 如果在调用此方法时扫描仪已关闭,或者在流程执行期间此扫描程序关闭,则抛出IllegalStateException

        此方法可能会阻止等待更多的输入。

        API Note:
        例如,以下代码将从字符串创建一个逗号分隔的令牌列表:
           List<String> result = new Scanner("abc,def,,ghi") .useDelimiter(",") .tokens() .collect(Collectors.toList());  

        结果列表将包含"abc""def" ,空字符串,并"ghi"

        结果
        令牌串的顺序流
        异常
        IllegalStateException - 如果此扫描仪已关闭
        从以下版本开始:
        9
      • findAll

        public Stream<MatchResult> findAll​(Pattern pattern)
        返回此扫描仪的匹配结果流。 该流包含相同的结果,只要findWithinHorizon()发现匹配,则依次调用findWithinHorizon(pattern, 0)然后match()返回相同的顺序。

        生成的流是顺序的和有序的。 所有流元素都不为空。

        使用该扫描仪的当前状态,在启动终端流操作时开始扫描。 随后调用此扫描仪上除close()ioException()之外的任何方法可能会返回未定义的结果,或可能对返回的流造成未定义的影响。 返回的流的源Spliterator故障快速的 ,如果在流管道执行期间检测到任何这样的呼叫,将尽力而为地抛出ConcurrentModificationException

        在流管道执行完成后,该扫描器处于不确定状态,不能重复使用。

        如果此扫描仪包含必须释放的资源,则应关闭此扫描仪,方法是通过调用其close()方法或关闭返回的流。 关闭流将关闭底层扫描程序。 如果调用此方法时扫描仪已关闭,或者在流管道执行期间此扫描器关闭,则抛出IllegalStateException

        findWithinHorizon()方法一样,此方法可能会阻止等待其他输入,并可能缓冲无限量的输入搜索匹配。

        API Note:
        例如,以下代码将读取一个文件,并返回由七个或更多拉丁大写字母组成的所有字符序列的列表:
           try (Scanner sc = new Scanner(Paths.get("input.txt"))) { Pattern pat = Pattern.compile("[A-Z]{7,}"); List<String> capWords = sc.findAll(pat) .map(MatchResult::group) .collect(Collectors.toList()); }  
        参数
        pattern - 要匹配的模式
        结果
        顺序的匹配结果流
        异常
        NullPointerException - 如果pattern为null
        IllegalStateException - 如果此扫描仪已关闭
        从以下版本开始:
        9
      • findAll

        public Stream<MatchResult> findAll​(String patString)
        返回与提供的模式字符串相匹配的匹配结果流。 效果等同于以下代码:
           scanner.findAll(Pattern.compile(patString))  
        参数
        patString - 模式字符串
        结果
        顺序的匹配结果流
        异常
        NullPointerException - 如果patString为空
        IllegalStateException - 如果此扫描仪已关闭
        PatternSyntaxException - 如果正则表达式的语法无效
        从以下版本开始:
        9
        另请参见:
        Pattern