所有类


java.util
类 Scanner

java.lang.Object
  继承者 java.util.Scanner
所有已实现的接口:
Iterator<String>

public final class Scanner
   
   
   
   
   
extends Object
implements Iterator<String>

一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。

Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。

例如,以下代码使用户能够从 System.in 中读取一个数:

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

再看一个例子,以下代码使 long 类型可以通过 myNumbers 文件中的项分配:

      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 

以下代码使用正则表达式同时分析所有的 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(); 

扫描器所使用的默认空白分隔符通过 Character.isWhitespace 来识别。

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

next()hasNext() 方法及其基本类型 companion 方法(如 nextInt()hasNextInt())首先跳过与分隔符模式匹配的输入,然后尝试返回下一个标记。在等待更多输入时 hasNextnext 方法都可能阻塞。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) 方法设置了不同的基数。

本地化数字

此类的一个实例能够以标准格式以及扫描器语言环境的格式扫描数字。扫描器的初始语言环境是 Locale.getDefault() 方法返回的值;它可以通过 useLocale(java.util.Locale) 方法更改。

本地化格式是根据以下参数定义的,对于某一特定语言环境来说,这些参数取自该语言环境的 DecimalFormat 对象 df,及其 DecimalFormatSymbols 对象 dfs

LocalGroupSeparator  用于分隔数千个组的字符, dfs.getGroupingSeparator()
LocalDecimalSeparator  用于小数点的字符, dfs.getDecimalSeparator()
LocalPositivePrefix  出现在正数前的字符串(可以为空), df.getPositivePrefix()
LocalPositiveSuffix  出现在正数后的字符串(可以为空), df.getPositiveSuffix()
LocalNegativePrefix  出现在负数前的字符串(可以为空), df.getNegativePrefix()
LocalNegativeSuffix  出现在负数后的字符串(可以为空), df.getNegativeSuffix()
LocalNaN  表示浮点值的非数字的字符串, dfs.getInfinity()
LocalInfinity  表示浮点值的无穷大的字符串, dfs.getInfinity()

数字语法

可通过此类的一个实例分析为数字的字符串是根据以下正则表达式语法指定的,在这种情况下 Rmax 是正在使用的基数中的最高数字(例如,在基数 10 中 Rmax 为 9)。

NonASCIIDigit  ::= 非 ASCII 字符 c,对于它,Character.isDigit(c) 返回 true
 
Non0Digit  ::= [1-Rmax] | NonASCIIDigit
 
Digit  ::= [0-Rmax] | NonASCIIDigit
 
GroupedNumeral  ::
= ( Non0DigitDigit? Digit?
LocalGroupSeparatorDigitDigitDigit )+ )
 
Numeral  ::= ( ( Digit+ ) | GroupedNumeral )
 
Integer  ::= ( [-+]? ( Numeral ) )
| LocalPositivePrefixNumeralLocalPositiveSuffix
| LocalNegativePrefixNumeralLocalNegativeSuffix
 
DecimalNumeral  ::= Numeral
| NumeralLocalDecimalSeparatorDigit*
| LocalDecimalSeparatorDigit+
 
Exponent  ::= ( [eE] [+-]? Digit+ )
 
Decimal  ::= ( [-+]? DecimalNumeralExponent? )
| LocalPositivePrefixDecimalNumeralLocalPositiveSuffixExponent?
| LocalNegativePrefixDecimalNumeralLocalNegativeSuffixExponent?
 
HexFloat  ::= [-+]? 0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+ ([pP][-+]?[0-9]+)?
 
NonNumber  ::= NaN | LocalNan | Infinity | LocalInfinity
 
SignedNonNumber  ::= ( [-+]? NonNumber )
| LocalPositivePrefixNonNumberLocalPositiveSuffix
| LocalNegativePrefixNonNumberLocalNegativeSuffix
 
Float  ::= Decimal
| HexFloat
| SignedNonNumber

上面正则表达式中的空白没有意义。

从以下版本开始:
1.5

构造方法摘要
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(ReadableByteChannel source)
          构造一个新的 Scanner,它生成的值是从指定信道扫描的。
Scanner(ReadableByteChannel source, String charsetName)
          构造一个新的 Scanner,它生成的值是从指定信道扫描的。
Scanner(String source)
          构造一个新的 Scanner,它生成的值是从指定字符串扫描的。
 
方法摘要
 voidclose()
          关闭此扫描器。
 Patterndelimiter()
          返回此 Scanner 当前正在用于匹配分隔符的 Pattern
 StringfindInLine(Pattern pattern)
          试图在忽略分隔符的情况下查找下一个指定模式。
 StringfindInLine(String pattern)
          试图在忽略分隔符的情况下查找下一个从指定字符串构造的模式。
 StringfindWithinHorizon(Pattern pattern, int horizon)
          试图查找下一个指定模式。
 StringfindWithinHorizon(String pattern, int horizon)
          试图在忽略分隔符的情况下查找下一个从指定字符串构造的模式。
 booleanhasNext()
          如果此扫描器的输入中有另一个标记,则返回 true。
 booleanhasNext(Pattern pattern)
          如果下一个完整标记与指定模式匹配,则返回 true。
 booleanhasNext(String pattern)
          如果下一个标记与从指定字符串构造的模式匹配,则返回 true。
 booleanhasNextBigDecimal()
          如果通过使用 nextBigDecimal() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 BigDecimal,则返回 true。
 booleanhasNextBigInteger()
          如果通过使用 nextBigInteger() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 BigInteger 值,则返回 true。
 booleanhasNextBigInteger(int radix)
          如果通过使用 nextBigInteger() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个 BigInteger 值,则返回 true。
 booleanhasNextBoolean()
          如果通过使用一个从字符串 "true|false" 创建的大小写敏感的模式,此扫描器输入信息中的下一个标记可以解释为一个布尔值,则返回 true。
 booleanhasNextByte()
          如果通过使用 nextByte() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个字节值,则返回 true。
 booleanhasNextByte(int radix)
          如果通过使用 nextByte() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个字节值,则返回 true。
 booleanhasNextDouble()
          如果通过使用 nextDouble() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 double 值,则返回 true。
 booleanhasNextFloat()
          如果通过使用 nextFloat() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 float 值,则返回 true。
 booleanhasNextInt()
          如果通过使用 nextInt() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 int 值,则返回 true。
 booleanhasNextInt(int radix)
          如果通过使用 nextInt() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个 int 值,则返回 true。
 booleanhasNextLine()
          如果在此扫描器的输入中存在另一行,则返回 true。
 booleanhasNextLong()
          如果通过使用 nextLong() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 long 值,则返回 true。
 booleanhasNextLong(int radix)
          如果通过使用 nextLong() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个 long 值,则返回 true。
 booleanhasNextShort()
          如果通过使用 nextShort() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 short 值,则返回 true。
 booleanhasNextShort(int radix)
          如果通过使用 nextShort() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个 short 值,则返回 true。
 IOExceptionioException()
          返回此 Scanner 的基础 Readable 最后抛出的 IOException
 Localelocale()
          返回此扫描器的语言环境。
 MatchResultmatch()
          返回此扫描器所执行的最后扫描操作的匹配结果。
 Stringnext()
          查找并返回来自此扫描器的下一个完整标记。
 Stringnext(Pattern pattern)
          如果下一个标记与指定模式匹配,则返回下一个标记。
 Stringnext(String pattern)
          如果下一个标记与从指定字符串构造的模式匹配,则返回下一个标记。
 BigDecimalnextBigDecimal()
          将输入信息的下一个标记扫描为一个 BigDecimal
 BigIntegernextBigInteger()
          将输入信息的下一个标记扫描为一个 BigInteger
 BigIntegernextBigInteger(int radix)
          将输入信息的下一个标记扫描为一个 BigInteger
 booleannextBoolean()
          扫描解释为一个布尔值的输入标记并返回该值。
 bytenextByte()
          将输入信息的下一个标记扫描为一个 byte
 bytenextByte(int radix)
          将输入信息的下一个标记扫描为一个 byte
 doublenextDouble()
          将输入信息的下一个标记扫描为一个 double
 floatnextFloat()
          将输入信息的下一个标记扫描为一个 float
 intnextInt()
          将输入信息的下一个标记扫描为一个 int
 intnextInt(int radix)
          将输入信息的下一个标记扫描为一个 int
 StringnextLine()
          此扫描器执行当前行,并返回跳过的输入信息。
 longnextLong()
          将输入信息的下一个标记扫描为一个 long
 longnextLong(int radix)
          将输入信息的下一个标记扫描为一个 long
 shortnextShort()
          将输入信息的下一个标记扫描为一个 short
 shortnextShort(int radix)
          将输入信息的下一个标记扫描为一个 short
 intradix()
          返回此扫描器的默认基数。
 voidremove()
          Iterator 的这种实现不支持移除操作。
 Scannerskip(Pattern pattern)
          在忽略分隔符的情况下跳过与指定模式匹配的输入信息。
 Scannerskip(String pattern)
          跳过与从指定字符串构造的模式匹配的输入信息。
 StringtoString()
          返回此 Scanner 的字符串表示形式。
 ScanneruseDelimiter(Pattern pattern)
          将此扫描器的分隔模式设置为指定模式。
 ScanneruseDelimiter(String pattern)
          将此扫描器的分隔模式设置为从指定 String 构造的模式。
 ScanneruseLocale(Locale locale)
          将此扫描器的语言环境设置为指定的语言环境。
 ScanneruseRadix(int radix)
          将此扫描器的默认基数设置为指定基数。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

构造方法详细信息

Scanner

public Scanner(Readable source)
构造一个新的 Scanner,它生成的值是从指定源扫描的。

参数:
source - 实现 Readable 接口的字符源

Scanner

public Scanner(InputStream source)
构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。来自该流的字节通过基础平台的默认字符集转换成字符。

参数:
source - 要扫描的输入流

Scanner

public Scanner(InputStream source,
               String charsetName)
构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。来自该流的字节通过指定字符集转换成字符。

参数:
source - 要扫描的输入流
charsetName - 用于将来自该流的字节转换成要扫描的字符的编码类型
抛出:
IllegalArgumentException - 如果指定字符集不存在

Scanner

public Scanner(File source)
        throws FileNotFoundException
构造一个新的 Scanner,它生成的值是从指定文件扫描的。来自该文件的字节通过基础平台的默认字符集转换成字符。

参数:
source - 要扫描的文件
抛出:
FileNotFoundException - 如果源文件未找到

Scanner

public Scanner(File source,
               String charsetName)
        throws FileNotFoundException
构造一个新的 Scanner,它生成的值是从指定文件扫描的。来自该文件的字节通过指定字符集转换成字符。

参数:
source - 要扫描的文件
charsetName - 用于将来自该文件的字节转换成要扫描的字符的编码类型
抛出:
FileNotFoundException - 如果源文件未找到
IllegalArgumentException - 如果指定的编码未找到

Scanner

public Scanner(String source)
构造一个新的 Scanner,它生成的值是从指定字符串扫描的。

参数:
source - 要扫描的字符串

Scanner

public Scanner(ReadableByteChannel source)
构造一个新的 Scanner,它生成的值是从指定信道扫描的。来自该源的字节通过基础平台的默认字符集转换成字符。

参数:
source - 要扫描的信道