20230418 java.util.Scanner
简介
public final class Scanner implements Iterator<String>, Closeable
- 一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。Scanner 使用分隔符模式将其输入分解为标记,默认情况下匹配空格。然后可以使用各种 next 方法将生成的标记转换为不同类型的值。
- Scanner 使用的默认空白定界符由 Character.isWhitespace() 识别。 reset() 方法会将 Scanner 的定界符的值重置为默认的空白定界符
- 默认空白定界符包括空格、回车、制表符等
- next 和 hasNext 方法及其伴随方法(例如 nextInt 和 hasNextInt)首先跳过与定界符模式匹配的任何输入,然后尝试返回下一个标记。
- hasNext() 和 next() 方法都可能阻止等待进一步的输入。 hasNext() 方法是否阻塞与其关联的 next() 方法是否阻塞无关。 tokens 方法也可能会阻塞等待输入。
- findInLine()、findWithinHorizon()、skip() 和 findAll() 方法独立于定界符模式运行。这些方法将尝试匹配指定的模式而不考虑输入中的分隔符,因此可以在分隔符不相关的特殊情况下使用。这些方法可能会阻塞等待更多输入。
- 当 Scanner 抛出 InputMismatchException 时,Scanner 将不会传递导致异常的令牌,以便可以通过其他方法检索或跳过它。
- 根据定界模式的类型,可能会返回空标记。例如,模式“\s+”将不会返回空标记,因为它匹配分隔符的多个实例。定界模式“\s”可能会返回空标记,因为它一次只传递一个空格。
- Scanner 可以从任何实现 Readable 接口的对象中读取文本。如果对底层可读对象的 read() 方法的调用抛出 IOException,则 Scanner 假定已到达输入的末尾。底层可读对象最近抛出的 IOException 可以通过 ioException 方法获取。
- 当 Scanner 关闭时,如果源实现了 Closeable 接口,它将关闭其输入源。
- 线程不安全
- 默认将数字解释为十进制,useRadix 方法设置不同的基数
- 能够扫描标准格式以及区域设置格式的数字。初始语言环境是 Locale.getDefault(Locale.Category.FORMAT) 方法返回的值;它可以通过 useLocale() 方法更改。
- 本地化格式根据以下参数定义,对于特定区域设置,这些参数取自该区域设置的 DecimalFormat 对象 df 及其 DecimalFormatSymbols 对象 dfs。
构造方法
File, InputStream, Path, ReadableByteChannel
- Scanner(File source)
- Scanner(File source, Charset charset)
- Scanner(File source, String charsetName)
Readable, String
- Scanner(Readable source)
public 方法
扫描器信息:
- delimiter, useDelimiter
- 返回定界符
- radix, useRadix
- 返回基数
- locale, useLocale
- 返回语言环境
hasNext 和 next 系列方法:
-
hasNext, hasNextLine
-
hasNextBigDecimal, hasNextBigInteger
-
hasNextBoolean, hasNextByte, hasNextDouble, hasNextFloat, hasNextInt, hasNextLong, hasNextShort
-
next, nextLine
-
nextBigDecimal, nextBigInteger
-
nextBoolean, nextByte, nextDouble, nextFloat, nextInt, nextLong, nextShort
-
close
-
ioException
- 返回此 Scanner 的底层 Readable 最后抛出的 IOException。如果不存在此类异常,则此方法返回 null。
-
findAll
-
findInLine
- 按行扫描,如果匹配不到返回null,并且Scanner位置不变
-
findWithinHorizon
- 入参 horizon 表示扫描范围长度
-
match
- 返回本扫描仪最后一次扫描操作的匹配结果。如果未执行任何匹配,或者如果最后一次匹配不成功,则此方法抛出 IllegalStateException。 Scanner 的各种 next 方法在完成且未抛出异常的情况下使匹配结果可用。例如,在调用返回 int 的 nextInt 方法后,此方法返回 MatchResult 以搜索上面定义的 Integer 正则表达式。类似地,findInLine()、findWithinHorizon() 和 skip() 方法在成功时将进行匹配。
-
reset
- 重置扫描仪会丢弃其所有可能已通过调用 useDelimiter() 、 useLocale() 或 useRadix() 更改的显式状态信息。
-
skip
- 跳过与指定模式匹配的输入,忽略定界符。如果指定模式的锚定匹配成功,此方法将跳过输入。如果在当前位置未找到指定模式的匹配项,则不会跳过任何输入并抛出 NoSuchElementException
-
tokens
- 从此扫描器返回以定界符分隔的令牌流。该流包含将返回的相同标记,从该扫描器的当前状态开始,通过重复调用 next 方法直到 hasNext 方法返回 false。生成的流是顺序的和有序的。所有流元素都是非空的。
-
toString
- 返回 Scanner 信息
测试用例
// 按行输出文件内容
Scanner sc = new Scanner(Path.of("D:\\Develop\\workspace\\study\\study-design-pattern\\src\\main\\java"
+ "\\study\\hwj\\test\\ScannerTest.java"));
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}