Java Scanner 的基本概念与作用
Java Scanner 是 java.util 包中的一个类,主要用于简化基本类型(如 int、double)、字符串以及自定义分隔符的输入操作,它提供了丰富的读取方法,能够从不同的输入源(如控制台、文件、字符串等)中高效获取数据,是 Java 编程中处理用户交互和文件读取的常用工具。

与传统的 BufferedReader 相比,Scanner 在处理基本类型输入时更加便捷,无需手动进行类型转换,适合初学者快速上手,它支持正则表达式匹配,能够灵活处理复杂的输入格式,因此在实际开发中被广泛应用。
Scanner 的创建与基本使用
创建 Scanner 对象
要使用 Scanner,首先需要创建其实例,最常见的方式是从标准输入流(即控制台)读取数据,代码如下:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
// 创建 Scanner 对象,关联 System.in(标准输入流)
Scanner scanner = new Scanner(System.in);
// 后续代码...
}
}
Scanner 还可以从文件、字符串等输入源读取数据,
// 从文件读取
Scanner fileScanner = new Scanner(new File("input.txt"));
// 从字符串读取
String text = "Hello 123 45.67";
Scanner strScanner = new Scanner(text);
基本输入方法
Scanner 提供了多种读取方法,支持不同类型的数据输入:
-
读取字符串(nextLine()):读取一整行输入,以换行符为结束标志,包含空格。
System.out.print("请输入一行文本:"); String line = scanner.nextLine(); System.out.println("输入内容:" + line); -
读取单词(next()):读取以空格为分隔符的下一个单词,跳过空格。

System.out.print("请输入一个单词:"); String word = scanner.next(); System.out.println("输入单词:" + word); -
读取整数(nextInt()):读取下一个
int类型值,若输入不匹配会抛出InputMismatchException。System.out.print("请输入一个整数:"); int num = scanner.nextInt(); System.out.println("输入整数:" + num); -
读取浮点数(nextDouble()、nextFloat()):类似
nextInt(),用于读取double或float类型数据。System.out.print("请输入一个浮点数:"); double decimal = scanner.nextDouble(); System.out.println("输入浮点数:" + decimal);
Scanner 的高级功能
分隔符自定义
Scanner 默认以空白字符(空格、换行、制表符等)作为分隔符,但可通过 useDelimiter() 方法自定义分隔符,例如使用逗号分隔:
Scanner scanner = new Scanner("apple,banana,orange");
scanner.useDelimiter(","); // 设置分隔符为逗号
while (scanner.hasNext()) {
System.out.println(scanner.next()); // 输出:apple、banana、orange
}
正则表达式匹配
Scanner 支持使用正则表达式判断输入是否符合特定格式,例如检查输入是否为数字:
System.out.print("请输入一个数字:");
if (scanner.hasNext("\\d+")) { // 匹配一个或多个数字
int num = scanner.nextInt();
System.out.println("输入有效:" + num);
} else {
System.out.println("输入不是有效数字!");
}
输入源管理
Scanner 关闭后会释放相关资源(如文件流),建议使用 try-with-resources 语句自动关闭资源,避免内存泄漏:
try (Scanner scanner = new Scanner(new File("data.txt"))) {
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException e) {
System.out.println("文件未找到!");
}
Scanner 使用中的注意事项
输入缓冲区问题
调用 next()、nextInt() 等方法后,输入缓冲区中可能残留未读取的换行符,导致后续输入异常。

System.out.print("请输入姓名:");
String name = scanner.next(); // 读取姓名,缓冲区残留换行符
System.out.print("请输入年龄:");
int age = scanner.nextInt(); // 直接读取换行符,导致 age 未被正确赋值
解决方案:在 nextInt() 后调用 nextLine() 清空缓冲区,或统一使用 nextLine() 读取整行后再手动分割数据。
异常处理
Scanner 的输入方法可能抛出 InputMismatchException(输入类型不匹配)或 NoSuchElementException(无输入),需通过 try-catch 捕获异常:
try {
System.out.print("请输入一个整数:");
int num = scanner.nextInt();
System.out.println("输入:" + num);
} catch (InputMismatchException e) {
System.out.println("输入类型错误,请输入整数!");
scanner.next(); // 清空缓冲区中的无效输入
}
性能考虑
Scanner 在处理大量数据时(如读取大文件),其性能可能略低于 BufferedReader,若对性能要求较高,可结合 BufferedReader 使用:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line = reader.readLine(); Scanner scanner = new Scanner(line);
Java Scanner 是一个功能强大且易用的输入工具,适合处理控制台交互、文件读取等多种场景,通过掌握其基本方法(如 nextLine()、nextInt())、高级功能(如自定义分隔符、正则匹配)以及注意事项(如缓冲区管理、异常处理),可以高效解决各类输入需求,在实际开发中,应根据场景选择合适的输入方式,并结合异常处理和资源管理机制,确保程序的稳定性和健壮性。


















