Java Scanner 类详解
介绍
Java Scanner 类是 java.util 包中的一个类,它可以从不同的输入源(如标准输入、文件、字符串等)读取数据,并将数据转换为 Java 中的基本类型或字符串。它是 Java 5 的新特性,可以方便地实现用户输入的获取和处理。
使用场景
Java Scanner 类适用于以下场景:
- 需要从控制台获取用户输入的数据,如姓名、年龄、成绩等。
- 需要从文件中读取数据,并进行分析或处理,如统计单词出现的次数、计算平均值等。
- 需要从字符串中提取数据,并转换为相应的类型,如从网页源码中获取链接、从 JSON 字符串中解析数据等。
使用方法
要使用 Java Scanner 类,首先需要导入 java.util.Scanner 包,然后创建一个 Scanner 对象,并指定输入源。例如:
import java.util.Scanner; // 导入包
Scanner input = new Scanner(System.in); // 创建对象,从标准输入读取
然后,可以使用 Scanner 类提供的各种方法来读取不同类型的输入。例如:
// 读取一个整数
int num = input.nextInt();
// 读取一个浮点数
double price = input.nextDouble();
// 读取一个单词
String word = input.next();
// 读取一行文本
String line = input.nextLine();
在读取输入之前,可以使用 hasNextXxx() 方法来判断是否还有输入的数据,以避免输入错误或异常。例如:
// 判断是否还有整数输入
if (input.hasNextInt()) {
// 读取整数
int num = input.nextInt();
}
// 判断是否还有浮点数输入
if (input.hasNextDouble()) {
// 读取浮点数
double price = input.nextDouble();
}
在使用完 Scanner 对象后,需要调用 close() 方法来关闭输入流,释放资源。例如:
input.close(); // 关闭输入流
底层原理
Java Scanner 类的底层原理是使用正则表达式来匹配和解析输入源中的数据。它使用了一个内部缓冲区(buffer)来存储输入源中的部分数据,并使用一个游标(position)来指示当前扫描的位置。当调用 nextXxx() 方法时,它会根据相应的正则表达式来查找下一个匹配的数据,并返回其值。如果没有找到匹配的数据,它会抛出一个 InputMismatchException 异常。如果输入源已经结束,它会抛出一个 NoSuchElementException 异常。
Java Scanner 类还使用了一个分隔符(delimiter)来划分不同的数据项,默认情况下是空白字符(包括空格、制表符、换行符等)。可以使用 useDelimiter() 方法来自定义分隔符,例如:
// 使用逗号作为分隔符
input.useDelimiter(",");
// 使用换行符作为分隔符
input.useDelimiter("\n");
Java Scanner 类还提供了一些其他的方法和设置,如 useLocale()、useRadix()、skip() 等,可以参考 API 文档来了解更多细节。
总结
Java Scanner 类是一个强大而灵活的类,可以从不同的输入源中读取和转换数据。它使用了正则表达式作为底层原理,可以根据不同的需求进行定制和扩展。它是 Java 中实现用户输入和文件处理的常用工具之一。