当前位置: 首页 > news >正文

Java-Scanner类

Scanner 是Java中一个实用的文本扫描工具类(位于 java.util 包),主要用于从输入流(如键盘、文件或字符串)中解析基本数据类型和字符串。它通过正则表达式将输入分解为标记(tokens),并提供了多种方法来读取和转换这些标记。


1. Scanner的核心功能

功能说明
读取输入从键盘、文件、字符串等来源读取数据。
按类型解析自动将输入的文本转换为 intdoubleString 等类型。
分隔符控制支持自定义分隔符(默认是空白符)。
正则匹配使用正则表达式验证或跳过特定模式的输入。

2. 构造方法

Scanner 可以从多种输入源构造:

构造方法说明
Scanner(InputStream source)从标准输入流(如键盘)读取,常用 System.in
Scanner(File source)从文件中读取数据(需处理 FileNotFoundException)。
Scanner(String source)直接解析字符串内容。
Scanner(Readable source)从任何实现了 Readable 接口的对象读取。

示例

// 从键盘输入
Scanner keyboardScanner = new Scanner(System.in);// 从字符串读取
Scanner stringScanner = new Scanner("Hello 123 45.67");// 从文件读取(需异常处理)
try {Scanner fileScanner = new Scanner(new File("data.txt"));
} catch (FileNotFoundException e) {e.printStackTrace();
}

3. 常用方法

3.1 读取基本类型

方法说明示例
nextInt()读取下一个 int 类型标记。int num = scanner.nextInt();
nextDouble()读取下一个 double 类型标记。double d = scanner.nextDouble()
nextBoolean()读取下一个 boolean 类型标记。boolean b = scanner.nextBoolean()
next()读取下一个 String 类型标记(以空白符分隔)。String s = scanner.next()
nextLine()读取一行文本(包括空格,直到换行符)。String line = scanner.nextLine()

示例

Scanner scanner = new Scanner("123 45.67 true Hello");
int i = scanner.nextInt();       // 123
double d = scanner.nextDouble(); // 45.67
boolean b = scanner.nextBoolean(); // true
String s = scanner.next();       // "Hello"

3.2 检查输入类型

方法说明
hasNextInt()检查下一个标记是否为 int
hasNextDouble()检查下一个标记是否为 double
hasNext()检查是否还有下一个标记。
hasNextLine()检查是否还有下一行。

示例

Scanner scanner = new Scanner("100 ABC");
if (scanner.hasNextInt()) {int num = scanner.nextInt(); // 不会执行,因为下一个是"ABC"
}

3.3 自定义分隔符

通过 useDelimiter() 方法设置分隔符(支持正则表达式)。
示例:按逗号分割输入

Scanner scanner = new Scanner("A,B,C,D");
scanner.useDelimiter(",");
while (scanner.hasNext()) {System.out.println(scanner.next()); // 输出 A, B, C, D
}

3.4 跳过特定模式

使用 skip() 跳过匹配正则表达式的部分。
示例:跳过所有数字

Scanner scanner = new Scanner("Hello123World456");
scanner.skip("\\d+"); // 跳过"123"
System.out.println(scanner.next()); // 输出 "World456"

4. 典型应用场景

4.1 从键盘读取用户输入

Scanner scanner = new Scanner(System.in);
System.out.print("请输入姓名:");
String name = scanner.nextLine();
System.out.print("请输入年龄:");
int age = scanner.nextInt();
System.out.println(name + "的年龄是" + age);
scanner.close(); // 关闭Scanner

4.2 解析结构化文本


String data = "John,25,New York;Alice,30,London";
Scanner scanner = new Scanner(data);
scanner.useDelimiter(";|,"); // 按分号或逗号分割
while (scanner.hasNext()) {String name = scanner.next();int age = scanner.nextInt();String city = scanner.next();System.out.println(name + " (" + age + ") - " + city);
}
scanner.close();

4.3 读取文件内容

try (Scanner fileScanner = new Scanner(new File("data.txt"))) {while (fileScanner.hasNextLine()) {System.out.println(fileScanner.nextLine());}
} catch (FileNotFoundException e) {e.printStackTrace();
}

5. 注意事项

  1. 资源释放
    Scanner 使用了底层I/O资源,使用后需调用 close() 关闭(或用try-with-resources)。

  2. 输入阻塞
    从 System.in 读取时,程序会等待用户输入。

  3. 类型匹配
    若输入与预期类型不匹配(如用 nextInt() 读取非数字),会抛出 InputMismatchException

  4. 换行符问题
    nextInt() 后直接调用 nextLine() 会读取残留的换行符,需额外处理:

    int num = scanner.nextInt();
    scanner.nextLine(); // 消耗换行符
    String line = scanner.nextLine();


6. 与替代方案的对比

场景Scanner替代方案(如BufferedReader)
键盘输入简单易用,支持类型转换。需手动解析字符串(如 Integer.parseInt())。
文件读取逐行或按标记解析方便。性能更高(适合大文件)。
正则支持内置正则分割和跳过功能。需自行实现正则匹配。

7. 总结

  • 核心用途:解析键盘输入、文件内容或字符串,支持按类型读取。

  • 关键方法

    • 读取:nextInt()nextLine()next()

    • 检查:hasNextInt()hasNextLine()

    • 控制:useDelimiter()skip()

  • 最佳实践

    • 始终关闭 Scanner(用 try-with-resources)。

    • 处理类型不匹配异常(InputMismatchException)。

    • 复杂场景可结合正则表达式。

相关文章:

  • 深入解析Java 内部类
  • 单电机FOC与多电机协同交叉耦合控制Simulink仿真方案
  • 深入浅出:AWS Cognito 认证机制详解
  • cf 禁止http/1.0和http/1.1的访问 是否会更安全?
  • easywechat 6.X AccessToken刷新问题
  • Linux【9】-----Linux系统编程(线程池和并发socket编程 c语言)
  • vue3中的Treeshaking特性是什么,并举例说明
  • TCP 在高速网络下的大数据量传输优化:拥塞控制、效率保障与协议演进​
  • 咨询进阶——125页麦肯锡业务流程规划方法论及流程规划案例【附全文阅读】
  • progress telerik fiddler解决微软账户登录80190001错误问题
  • docker解析
  • 函数指针与指针函数
  • 操作系统的概述之三
  • 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法三)不定长滑动窗口+数组
  • 【Linux】理解进程状态与优先级:操作系统中的调度原理
  • 电脑录屏软件推荐,干净无广告快速使用
  • python -日期与天数的转换
  • Vue基础(18)_收集表单数据
  • 06-three.js 创建自己的缓冲几何体
  • 【数据结构】map/set模拟实现(红黑树作底层)