java scanner用法(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在Java编程中,与用户或系统的交互是程序设计的核心环节之一。无论是开发简单的命令行工具,还是复杂的图形化界面应用,输入与输出操作都是不可或缺的基础技能。Scanner
类作为Java标准库中用于解析输入的强大工具,能够帮助开发者高效地实现数据读取功能。对于编程初学者而言,掌握Scanner
的用法不仅能提升代码编写效率,还能为后续学习更复杂的IO操作打下坚实基础。本文将以循序渐进的方式,结合实际案例和形象比喻,深入解析Scanner
类的核心功能及常见应用场景。
一、Scanner类的基础概念与工作原理
1.1 什么是Scanner?
Scanner
类是Java中用于解析基本类型和字符串输入的工具,它能够将输入流(如控制台输入、文件内容等)转换为程序可处理的数据类型。可以将其想象为一位“翻译官”:当用户输入文字或数字时,Scanner
会根据预设的规则,将这些原始文本翻译成Java代码能直接使用的变量值。
1.2 Scanner的核心功能
- 解析输入:将输入流中的字符串转换为整数、浮点数、布尔值等数据类型。
- 分隔符处理:自动识别输入中的分隔符(如空格、换行符),并按需提取数据片段。
- 灵活输入源:支持从控制台、文件或自定义输入流中读取数据。
1.3 使用Scanner的三个步骤
- 导入类:通过
import java.util.Scanner;
引入Scanner类。 - 创建实例:指定输入源(如
System.in
表示控制台输入)。 - 读取数据:调用对应的方法(如
nextInt()
、nextLine()
)获取数据。
二、基础用法:从控制台读取输入
2.1 最简单的Scanner示例
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner实例
System.out.print("请输入您的姓名:");
String name = scanner.nextLine(); // 读取整行输入
System.out.println("您好," + name + "!");
scanner.close(); // 关闭Scanner对象
}
}
代码解析:
new Scanner(System.in)
:将输入源绑定到控制台。nextLine()
方法会读取用户输入的一整行文本,直到按下回车键为止。scanner.close()
:关闭资源,避免内存泄漏。
2.2 读取不同数据类型的输入
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数:");
int number = scanner.nextInt(); // 读取整数
System.out.print("请输入一个浮点数:");
double decimal = scanner.nextDouble(); // 读取浮点数
System.out.print("请输入一个布尔值(true/false):");
boolean flag = scanner.nextBoolean(); // 读取布尔值
注意事项:
- 类型匹配:若用户输入与方法类型不符(如用
nextInt()
输入字母),会抛出InputMismatchException
异常。 - 换行符处理:
nextInt()
等方法会保留换行符,导致后续nextLine()
直接读取空行。解决方法是在nextLine()
前添加一个空读取操作:int number = scanner.nextInt(); scanner.nextLine(); // 清空换行符 String comment = scanner.nextLine();
三、进阶技巧:处理复杂输入场景
3.1 自定义分隔符解析
默认情况下,Scanner
以空格、换行符或制表符作为分隔符。若需自定义分隔符(例如用逗号分隔),可通过useDelimiter()
方法实现:
Scanner csvScanner = new Scanner("Alice,30,Boston").useDelimiter(",");
String name = csvScanner.next(); // "Alice"
int age = csvScanner.nextInt(); // 30
String city = csvScanner.next(); // "Boston"
比喻:分隔符如同“标点符号”,Scanner
会根据指定的标点将输入内容拆分为独立的数据片段。
3.2 从文件读取数据
通过Scanner
读取文件内容时,需先创建文件输入流:
File file = new File("data.txt");
Scanner fileScanner = new Scanner(file);
while (fileScanner.hasNextLine()) {
String line = fileScanner.nextLine();
System.out.println(line);
}
fileScanner.close();
异常处理:文件路径错误或权限问题会导致FileNotFoundException
,建议使用try-with-resources
语句自动关闭资源:
try (Scanner scanner = new Scanner(new File("data.txt"))) {
// 处理逻辑
} catch (IOException e) {
e.printStackTrace();
}
3.3 高级过滤与查找
Scanner
支持通过正则表达式过滤输入内容:
Scanner regexScanner = new Scanner("123-456-7890");
regexScanner.useDelimiter("\\D+"); // 以非数字字符分隔
while (regexScanner.hasNextInt()) {
int num = regexScanner.nextInt();
System.out.print(num + " "); // 输出:123 456 7890
}
四、常见问题与解决方案
4.1 输入不匹配异常(InputMismatchException)
当调用nextInt()
但用户输入了字符串时,程序会抛出异常。解决方案是:
- 使用try-catch捕获异常:
try { int num = scanner.nextInt(); } catch (InputMismatchException e) { System.out.println("请输入有效数字!"); scanner.next(); // 清空错误输入 }
- 改用next()方法获取字符串后转换:
String input = scanner.next(); int num = Integer.parseInt(input); // 可能抛出NumberFormatException
4.2 资源未关闭问题
未调用close()
可能导致资源泄漏。最佳实践是使用try-with-resources
:
try (Scanner scanner = new Scanner(System.in)) {
// 代码逻辑
} // 自动关闭scanner
4.3 处理多行输入
若需读取多行文本(如用户输入一段描述),可循环调用nextLine()
:
System.out.println("请输入多行文本(输入EOF结束):");
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.equalsIgnoreCase("EOF")) break;
System.out.println("您输入的内容:" + line);
}
五、实战案例:简易计算器程序
import java.util.Scanner;
public class SimpleCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入第一个数字:");
double num1 = scanner.nextDouble();
System.out.print("请输入第二个数字:");
double num2 = scanner.nextDouble();
System.out.print("请选择运算符 (+, -, *, /):");
char operator = scanner.next().charAt(0);
double result;
switch (operator) {
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '/':
if (num2 == 0) {
System.out.println("除数不能为零!");
return;
}
result = num1 / num2;
break;
default:
System.out.println("无效的运算符!");
return;
}
System.out.printf("%.2f %c %.2f = %.2f%n", num1, operator, num2, result);
scanner.close();
}
}
运行示例:
请输入第一个数字:15
请输入第二个数字:3
请选择运算符 (+, -, *, /):/
15.00 / 3.00 = 5.00
结论:掌握Scanner是Java编程的重要基石
通过本文的讲解,读者应已掌握Scanner
类的核心功能、常见用法及问题解决策略。从基础的控制台输入到复杂的文件解析,Scanner
凭借其灵活的分隔符处理和类型转换能力,成为Java开发者必备的工具之一。建议读者通过以下步骤巩固知识:
- 动手实践:尝试修改示例代码,测试不同输入场景。
- 阅读文档:查阅
Scanner
类的官方API文档,探索更多方法(如hasNext()
、findInLine()
)。 - 解决实际问题:将
Scanner
应用于自己的项目中,如实现问卷调查程序或数据统计工具。
记住,熟练掌握Scanner
不仅能提升代码效率,更能为后续学习Java NIO、网络编程等高级IO技术奠定基础。通过不断练习与探索,您将逐渐成长为能够应对复杂输入输出场景的Java开发者。