Java Scanner 类:详解输入处理及常用方法358


Java 的 `Scanner` 类是位于 `` 包中的一个强大的工具,用于从各种输入源(如标准输入、文件或字符串)读取数据。它提供了一套简洁易用的方法,可以高效地解析不同类型的数据,例如整数、浮点数、字符串以及布尔值。本文将深入探讨 `Scanner` 类的使用方法,涵盖其核心方法、常见应用场景以及一些高级技巧。

一、Scanner 的基本使用

首先,我们需要导入 `` 包: `import ;` 然后,我们可以创建一个 `Scanner` 对象,并指定输入源。最常见的输入源是 ``,表示标准输入流(通常是键盘)。
Scanner scanner = new Scanner();

接下来,我们可以使用 `Scanner` 的各种方法读取不同的数据类型。例如,`nextInt()` 读取整数,`nextDouble()` 读取双精度浮点数,`next()` 读取下一个单词(以空格为分隔符),`nextLine()` 读取整行输入。
int age = ();
double price = ();
String name = ();
String address = (); // 读取整行,注意处理换行符
("Age: " + age);
("Price: " + price);
("Name: " + name);
("Address: " + address);

需要注意的是,`nextLine()` 在 `nextInt()`、`nextDouble()` 等方法之后使用时,可能会出现读取不到预期结果的情况。这是因为这些方法只读取数值,而留下换行符在输入缓冲区中。`nextLine()` 会直接读取并消费这个换行符。解决方法是在这些方法之后添加一个额外的 `nextLine()` 来清除缓冲区中的换行符。
int age = ();
(); // 消除换行符
String name = ();
("Age: " + age);
("Name: " + name);


二、Scanner 的常用方法

除了上面提到的基本方法,`Scanner` 还提供了许多其他的实用方法:
hasNextInt(), hasNextDouble(), hasNext(), hasNextLine(): 这些方法用于检查输入中是否存在下一个指定类型的数据,避免程序抛出异常。
nextBoolean(): 读取布尔值 (true 或 false)。
nextLong(): 读取长整数。
nextFloat(): 读取单精度浮点数。
useDelimiter(String pattern): 更改输入的分隔符,默认为空格。 这允许你根据自己的需要灵活地解析数据,例如用逗号分隔的CSV文件。
close(): 关闭 `Scanner` 对象,释放资源。在程序结束时,务必调用此方法。


三、从文件读取数据

`Scanner` 不仅可以从标准输入读取数据,还可以从文件中读取数据。只需在创建 `Scanner` 对象时,将文件路径作为参数传递给构造函数即可。
try (Scanner fileScanner = new Scanner(new File(""))) {
while (()) {
String line = ();
(line);
}
} catch (FileNotFoundException e) {
("File not found: " + ());
}

这段代码演示了如何从名为 "" 的文件中读取每一行数据并打印出来。`try-with-resources` 语句确保在使用完 `Scanner` 后自动关闭文件,即使发生异常也能保证资源得到释放。

四、高级应用:自定义分隔符和正则表达式

`useDelimiter()` 方法允许使用自定义分隔符,这在处理格式化数据时非常有用。例如,如果数据用逗号分隔,我们可以将其设置为逗号作为分隔符。
Scanner scanner = new Scanner("apple,banana,orange");
(",");
while (()) {
(());
}

更进一步,我们可以使用正则表达式作为分隔符,这提供了更加灵活的数据解析能力。
Scanner scanner = new Scanner("apple;banana,orange");
("[,;]"); // 分隔符为逗号或分号
while (()) {
(());
}


五、总结

Java 的 `Scanner` 类是一个功能强大的工具,可以简化从各种输入源读取数据的过程。 通过掌握其常用方法和高级技巧,我们可以高效地处理各种类型的输入数据,并构建更健壮的 Java 应用程序。 记住在使用完 `Scanner` 后始终调用 `close()` 方法来释放资源,避免潜在的问题。

2025-07-06


上一篇:Java数组与集合:深入理解数据结构与应用场景

下一篇:Java数组实际内存位置及寻址机制详解