Java 中的 Scanner 类

2025年6月23日 | 阅读 9 分钟

Java 提供了多种从用户读取输入的方式。使用 Scanner 类从用户读取输入是其中一种。它是从用户读取输入的简便方法。Java Scanner 类属于 java.util 包。

Scanner 类使用分隔符将输入分解为标记,默认分隔符是空格。它提供了许多读取和解析各种基本类型的方法。

它广泛用于使用正则表达式解析文本中的字符串和基本类型。借助 Scanner 类,我们可以以 int、long、double、byte、float、short 等基本类型读取用户的输入。

Java Scanner 类继承了 Object 类,并实现了 Iterator 和 Closeable 接口。

Java Scanner 类提供了 nextXXX() 方法来返回值的类型,例如 nextInt()、nextByte()、nextShort()、next()、nextLine()、nextDouble()、nextFloat()、nextBoolean() 等。要从 scanner 获取单个字符,我们可以调用 next().charAt(0) 方法,该方法返回单个字符。

Java Scanner 类声明

如何获取 Java Scanner?

要获取读取用户输入的 Java Scanner 实例,我们需要将输入流 (System.in) 传递给 Scanner 类的构造函数。例如

要获取解析字符串的 Java Scanner 实例,我们需要将字符串传递给 Scanner 类的构造函数。例如

Java Scanner 类构造函数

构造函数描述
Scanner(File source)构造一个新的 Scanner,该 Scanner 从指定的文件生成扫描值。
Scanner(File source, String charsetName)构造一个新的 Scanner,该 Scanner 从指定的文件生成扫描值。
Scanner(InputStream source)构造一个新的 Scanner,该 Scanner 从指定输入流生成扫描值。
Scanner(InputStream source, String charsetName)构造一个新的 Scanner,该 Scanner 从指定输入流生成扫描值。
Scanner(Readable source)构造一个新的 Scanner,该 Scanner 从指定源生成扫描值。
Scanner(String source)构造一个新的 Scanner,该 Scanner 从指定字符串生成扫描值。
Scanner(ReadableByteChannel source)构造一个新的 Scanner,该 Scanner 从指定通道生成扫描值。
Scanner(ReadableByteChannel source, String charsetName)构造一个新的 Scanner,该 Scanner 从指定通道生成扫描值。
Scanner(Path source)构造一个新的 Scanner,该 Scanner 从指定的文件生成扫描值。
Scanner(Path source, String charsetName)构造一个新的 Scanner,该 Scanner 从指定的文件生成扫描值。

Java Scanner 类方法

Java Scanner 类提供以下方法。

修饰符 & 类型方法描述
voidclose()用于关闭此 scanner。
patterndelimiter()用于获取 Scanner 类当前用于匹配分隔符的 Pattern。
Stream<MatchResult>findAll()用于查找与提供的模式字符串匹配的 MatchResult 流。
StringfindInLine()用于在忽略分隔符的情况下查找由指定字符串构造的模式的下一个出现。
stringfindWithinHorizon()用于在忽略分隔符的情况下查找由指定字符串构造的模式的下一个出现。
booleanhasNext()如果此 scanner 的输入中有下一个标记,则返回 true。
booleanhasNextBigDecimal()用于检查此 scanner 输入中的下一个标记是否可以使用 nextBigDecimal() 方法解释为 BigDecimal。
booleanhasNextBigInteger()用于检查此 scanner 输入中的下一个标记是否可以使用 nextBigDecimal() 方法解释为 BigDecimal。
booleanhasNextBoolean()用于检查此 scanner 输入中的下一个标记是否可以使用 nextBoolean() 方法解释为 Boolean。
booleanhasNextByte()用于检查此 scanner 输入中的下一个标记是否可以使用 nextBigDecimal() 方法解释为 Byte。
booleanhasNextDouble()用于检查此 scanner 输入中的下一个标记是否可以使用 nextByte() 方法解释为 BigDecimal。
booleanhasNextFloat()用于检查此 scanner 输入中的下一个标记是否可以使用 nextFloat() 方法解释为 Float。
booleanhasNextInt()用于检查此 scanner 输入中的下一个标记是否可以使用 nextInt() 方法解释为 int。
booleanhasNextLine()用于检查此 scanner 的输入中是否还有下一行。
booleanhasNextLong()用于检查此 scanner 输入中的下一个标记是否可以使用 nextLong() 方法解释为 Long。
booleanhasNextShort()用于检查此 scanner 输入中的下一个标记是否可以使用 nextShort() 方法解释为 Short。
IOExceptionioException()用于获取此 Scanner 的可读对象最后抛出的 IOException。
区域设置locale()用于获取 Scanner 类的 Locale。
MatchResultmatch()用于获取此 scanner 执行的最后一个扫描操作的匹配结果。
Stringnext()用于获取 scanner 中当前使用的下一个完整标记。
BigDecimalnextBigDecimal()将输入中的下一个标记扫描为 BigDecimal。
BigIntegernextBigInteger()将输入中的下一个标记扫描为 BigInteger。
booleannextBoolean()将输入中的下一个标记扫描为布尔值并返回该值。
bytenextByte()将输入中的下一个标记扫描为字节。
doublenextDouble()将输入中的下一个标记扫描为双精度值。
floatnextFloat()将输入中的下一个标记扫描为浮点数。
intnextInt()将输入中的下一个标记扫描为 Int。
StringnextLine()用于获取 Scanner 对象跳过的输入字符串。
longnextLong()将输入中的下一个标记扫描为长整型。
shortnextShort()将输入中的下一个标记扫描为短整型。
intradix()用于获取 Scanner 使用的默认基数。
voidremove()当 Iterator 的此实现不支持 remove 操作时使用。
Scannerreset()用于重置当前使用的 Scanner。
Scannerskip()跳过与指定模式匹配的输入,忽略分隔符
Stream<String>tokens()用于获取 Scanner 对象中分隔符分隔的标记的流。
StringtoString()用于获取 Scanner 的字符串表示形式。
ScanneruseDelimiter()用于将当前使用的 Scanner 的分隔模式设置为指定模式。
ScanneruseLocale()用于将此 scanner 的 Locale 对象设置为指定的 Locale。
ScanneruseRadix()用于将当前使用的 Scanner 的默认基数设置为指定的基数。

示例-1

让我们看一个简单的 Java Scanner 示例,其中我们从用户获取单个输入。这里,我们通过 in.nextLine() 方法请求一个字符串。

输出

Enter your name: Jack
Name is: Jack

示例-2

输出

Boolean Result: true
String: Hello, Welcome to TpointTech.
-------Enter Your Details---------
Enter your name: Andrew
Name: Andrew
Enter your age: 23
Age: 23
Enter your salary: 25000
Salary: 25000.0

示例-3

输出

Boolean Result: false
---Tokenizes String---
Hello
This is TpointTech
My name is Jack.
Delimiter used: /

Scanner 类的优点

  • 用户友好:Scanner 提供了一种简单直观的输入读取方式,尤其适合初学者。
  • 内置解析:它可以直接解析输入中的基本数据类型(例如 int、double 和 boolean),而无需手动转换。
  • 灵活的输入源:Scanner 可以从多种源读取输入,如 System.in、字符串、文件和流。
  • 标记化支持:它根据分隔符将输入分割成标记,可以使用 useDelimiter() 进行自定义。
  • 便捷的方法:提供 hasNextXxx() 方法在读取之前验证输入类型,有助于避免输入不匹配异常。

Scanner 类的缺点

  • 性能开销:与 BufferedReader 相比,Scanner 相对较慢,尤其是在处理大量数据时。
  • 区域敏感性:解析数字取决于默认或设置的 Locale,在不同地区可能导致意外行为。
  • next() 与 nextLine() 的混淆:它经常让初学者感到困惑,因为 next() 读取到空格为止,而 nextLine() 读取整行,导致输入跳过问题。
  • 格式控制有限:Scanner 缺乏其他输入方法(如 BufferedReader + InputStreamReader)中提供的的高级格式化选项。
  • 资源管理:不当使用(如关闭 System.in)可能导致应用程序其他部分的输入流错误。

要记住的重要事项

  • 需要导入:在使用 Scanner 类之前,始终导入 java.util.Scanner。
  • 默认分隔符:Scanner 使用空格作为默认分隔符。使用 useDelimiter() 进行更改。
  • 基本类型输入:Scanner 可以读取 int、double、float、long、short、byte 等各种基本类型,以及 boolean。
  • 字符串输入差异
    1. next() 只读取一个单词(标记)。
    2. nextLine() 读取整行,包括空格。
  • 资源处理:始终使用 in.close() 关闭 Scanner,以避免资源泄露。
  • 标记检查:在读取之前,使用 hasNext()、hasNextInt()、hasNextDouble() 等方法检查下一个标记,以避免运行时异常。
  • 读取单个字符:使用 in.next().charAt(0) 读取单个字符。

结论

Scanner 是 Java 中一个方便的类,它允许应用程序从键盘、文件或字符串获取输入。这个库在控制台应用程序中非常有价值,用于处理从字符串到整数、浮点数和布尔值等各种数据。

借助 next()、nextLine()、nextInt() 和 nextDouble(),开发人员可以轻松获取用户输入。由于 Scanner 允许您更改分隔符的工作方式并进行类型检查,因此它是 Java 编程中有用的类。

无论您是在处理简单的命令行应用程序还是文本数据,在 Java 中使用 Scanner 类都可以使输入简单安全。

Scanner 类选择题

1. Java 中的 Scanner 类包含在哪个包中?

  1. java.io
  2. java.lang
  3. java.util
  4. java.text

答案:C

解释:Scanner 类是 java.util 包的一部分,通常用于从输入流、字符串和文件等各种源获取输入。


2. Scanner 类默认使用什么作为分隔符?

  1. , (逗号)
  2. ; (分号)
  3. 空白字符
  4. 换行符 (\n)

答案:C

解释:默认情况下,Scanner 类根据空格字符(空格、制表符、换行符)将输入分割成标记。


3. 使用 Scanner 读取整行文本输入使用哪个方法?

  1. next()
  2. readLine()
  3. nextString()
  4. nextLine()

答案: D

解释:nextLine() 读取整行,包括空格,直到遇到换行符。


4. next().charAt(0) 方法返回什么?

  1. 下一个标记作为 String
  2. 下一个标记的第一个字符
  3. 输入字符数组
  4. 第一个字符的 ASCII 码

答案: B

解释:next() 将下一个标记作为 String 返回。在其上调用 charAt(0) 可获得该标记的第一个字符。


5. 如果调用 in.nextInt() 并且输入不是有效的整数,会发生什么?

  1. 它抛出 NumberFormatException
  2. 它抛出 InputMismatchException
  3. 它返回 0
  4. 它跳过输入

答案: B

解释:如果调用 nextInt() 并且输入不是有效的整数,Scanner 会抛出 InputMismatchException。


下一主题Java 文件处理