- java.lang.Object
-
- java.util.Scanner
-
- All Implemented Interfaces:
-
Closeable,AutoCloseable,Iterator<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 locale是
Locale.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 方法 描述 voidclose()关闭此扫描仪。Patterndelimiter()返回Pattern这个Scanner当前用于匹配分隔符。Stream<MatchResult>findAll(String patString)返回与提供的模式字符串相匹配的匹配结果流。Stream<MatchResult>findAll(Pattern pattern)返回此扫描仪的匹配结果流。StringfindInLine(String pattern)尝试查找从指定字符串构造的模式的下一个出现,忽略分隔符。StringfindInLine(Pattern pattern)尝试找到忽略分隔符的指定模式的下一个出现。StringfindWithinHorizon(String pattern, int horizon)尝试查找从指定字符串构造的模式的下一个出现,忽略分隔符。StringfindWithinHorizon(Pattern pattern, int horizon)尝试找到指定模式的下一个出现。booleanhasNext()如果此扫描仪在其输入中有另一个令牌,则返回true。booleanhasNext(String pattern)如果下一个令牌匹配从指定字符串构造的模式,则返回true。booleanhasNext(Pattern 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()方法将其解释为双重值,则返回true。booleanhasNextFloat()如果此扫描仪输入中的下一个标记可以使用nextFloat()方法将其解释为浮点值,则返回true。booleanhasNextInt()如果此扫描仪输入中的下一个标记可以使用nextInt()方法将其解释为默认基数中的int值,则返回true。booleanhasNextInt(int radix)如果扫描仪的输入中的下一个标记可以使用nextInt()方法解释为指定基数中的int值,则返回true。booleanhasNextLine()如果扫描仪的输入中有另一行,则返回true。booleanhasNextLong()如果此扫描仪的输入中的下一个令牌可以使用nextLong()方法将其解释为默认基数中的长值,则返回true。booleanhasNextLong(int radix)如果此扫描仪输入中的下一个标记可以使用nextLong()方法将其解释为指定基数中的长 整型值,则返回true。booleanhasNextShort()如果此扫描仪输入中的下一个标记可以使用nextShort()方法将其解释为默认基数中的一个短值,则返回true。booleanhasNextShort(int radix)如果此扫描仪输入中的下一个标记可以使用nextShort()方法将其解释为指定基数中的一个短值,则返回true。IOExceptionioException()返回IOException最后通过此抛出Scanner的基本Readable。Localelocale()返回此扫描仪的区域设置。MatchResultmatch()返回此扫描仪执行的最后扫描操作的匹配结果。Stringnext()查找并返回此扫描仪的下一个完整令牌。Stringnext(String pattern)如果匹配从指定字符串构造的模式,则返回下一个令牌。Stringnext(Pattern 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的此实现不支持删除操作。Scannerreset()重设此扫描仪。Scannerskip(String pattern)跳过与指定字符串构成的模式匹配的输入。Scannerskip(Pattern pattern)跳过与指定模式匹配的输入,忽略分隔符。Stream<String>tokens()从此扫描仪返回一个分隔符的分隔符号流。StringtoString()返回此Scanner的字符串表示Scanner。ScanneruseDelimiter(String pattern)将此扫描仪的分隔模式设置为从指定的String构造的模式。ScanneruseDelimiter(Pattern pattern)将此扫描仪的分隔模式设置为指定的模式。ScanneruseLocale(Locale locale)将此扫描仪的区域设置设置为指定的区域设置。ScanneruseRadix(int radix)将此扫描仪的默认基数设置为指定的基数。-
Methods inherited from interface java.util.Iterator
forEachRemaining
-
-
-
-
构造方法详细信息
-
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) throws FileNotFoundException
构造一个新的Scanner,产生从指定文件扫描的值。 使用底层平台的default charset将文件中的字节转换为字符。- 参数
-
source- 要扫描的文件 - 异常
-
FileNotFoundException- 如果找不到源
-
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))。- 参数
-
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包含可能对调试有用的信息。 确切的格式是未指定的。
-
hasNext
public boolean hasNext()
如果此扫描仪在其输入中有另一个令牌,则返回true。 此方法可能会在等待输入扫描时屏蔽。 扫描仪不会超过任何输入。- Specified by:
-
hasNext在接口Iterator<String> - 结果
- 当且仅当该扫描仪具有另一个令牌时才为真
- 异常
-
IllegalStateException- 如果此扫描仪已关闭 - 另请参见:
-
Iterator
-
next
public String next()
- Specified by:
-
next在接口Iterator<String> - 结果
- 下一个标记
- 异常
-
NoSuchElementException- 如果没有更多的令牌可用 -
IllegalStateException- 如果此扫描仪已关闭 - 另请参见:
-
Iterator
-
remove
public void remove()
Iterator的此实现不支持删除操作。- Specified by:
-
remove在接口Iterator<String> - 异常
-
UnsupportedOperationException- 如果这个方法被调用。 - 另请参见:
-
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)
- 参数
-
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()
将输入的下一个标记扫描为short。对这种
nextShort()形式的方法的调用与调用nextShort(radix)完全相同 ,其中radix是该扫描仪的默认基数。- 结果
-
short从输入扫描 - 异常
-
InputMismatchException- 如果下一个令牌与 整数正则表达式不匹配或超出范围 -
NoSuchElementException- 输入是否耗尽 -
IllegalStateException- 如果此扫描仪已关闭
-
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- 如果此扫描仪已关闭
-
nextBigInteger
public BigInteger nextBigInteger(int radix)
将输入的下一个标记扫描为BigInteger。如果下一个令牌匹配上面定义的Integer正则表达式,则令牌将转换为
BigInteger值,就像删除所有组分隔符一样,通过Character.digit将非ASCII数字映射为ASCII数字,并将生成的字符串传递给BigInteger(String, int)构造函数,指定的基数。如果基数小于
Character.MIN_RADIX或大于Character.MAX_RADIX,则抛出IllegalArgumentException。- 参数
-
radix- 用于解释令牌的基数 - 结果
-
BigInteger从输入扫描 - 异常
-
InputMismatchException- 如果下一个标记与 整数正则表达式不匹配,或超出范围 -
NoSuchElementException- 输入是否耗尽 -
IllegalStateException- 如果此扫描仪已关闭 -
IllegalArgumentException- 如果基数超出范围
-
hasNextBigDecimal
public boolean hasNextBigDecimal()
如果此扫描仪的输入中的下一个标记可以使用nextBigDecimal()方法解释为BigDecimal则返回true。 扫描仪不会超过任何输入。- 结果
-
如果且仅当此扫描仪的下一个令牌是有效的
BigDecimal - 异常
-
IllegalStateException- 如果此扫描仪已关闭
-
nextBigDecimal
public BigDecimal nextBigDecimal()
将输入的下一个标记扫描为BigDecimal。如果下一个令牌符合上述定义的2706445636270正则表达式,则令牌将转换为
BigDecimal值,如同通过删除所有组分隔符一样,通过Character.digit将非ASCII数字映射为ASCII数字,并将生成的字符串传递给270644563669393构造函数。- 结果
-
BigDecimal从输入扫描 - 异常
-
InputMismatchException- 如果下一个标记与 Decimal正则表达式不匹配,或超出范围 -
NoSuchElementException- 输入是否耗尽 -
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
-
-