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

Java Scanner 类详解

一、Scanner 类的核心功能

Scanner类位于java.util包下,主要用于从各种输入源(如标准输入、文件、字符串等)解析基本数据类型和字符串。其核心功能包括:

  1. 基本数据类型解析:支持读取intdoubleboolean等基本类型
  2. 字符串解析:按行或按分隔符读取字符串
  3. 自定义分隔符:通过useDelimiter()方法指定分隔符
  4. 正则表达式匹配:支持使用正则表达式匹配特定模式

二、基本用法:从标准输入读取数据

1. 读取控制台输入的字符串和数字

 
import java.util.Scanner;public class ScannerExample {public static void main(String[] args) {// 创建Scanner对象,关联标准输入流Scanner scanner = new Scanner(System.in);System.out.print("请输入您的姓名: ");String name = scanner.nextLine();  // 读取整行文本System.out.print("请输入您的年龄: ");int age = scanner.nextInt();       // 读取整数System.out.print("请输入您的身高(m): ");double height = scanner.nextDouble();  // 读取浮点数System.out.printf("姓名: %s, 年龄: %d, 身高: %.2f\n", name, age, height);// 关闭Scanner(重要!避免资源泄漏)scanner.close();}
}

2. 关键方法说明

  • nextLine():读取一整行文本(包括换行符),返回字符串
  • next():读取下一个标记(以分隔符为界),返回字符串
  • nextInt()、**nextDouble()** 等:读取对应类型的数据,指针移至下一个标记
  • hasNext()、**hasNextInt()** 等:判断是否还有下一个标记或特定类型的数据

三、处理不同输入源

1. 从文件读取数据

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;public class FileReadingExample {public static void main(String[] args) {try {// 创建File对象指向待读取的文件File file = new File("data.txt");// 创建Scanner对象关联文件输入流Scanner scanner = new Scanner(file);// 逐行读取文件内容while (scanner.hasNextLine()) {String line = scanner.nextLine();System.out.println(line);}scanner.close();  // 关闭Scanner} catch (FileNotFoundException e) {e.printStackTrace();}}
}
 

2. 从字符串读取数据

 
import java.util.Scanner;public class StringParsingExample {public static void main(String[] args) {String input = "姓名:张三 年龄:25 身高:1.75";// 创建Scanner对象关联字符串Scanner scanner = new Scanner(input);// 设置分隔符为空格或冒号scanner.useDelimiter("[ :]");while (scanner.hasNext()) {String token = scanner.next();System.out.println(token);}scanner.close();}
}
 

四、高级用法:自定义分隔符与正则匹配

1. 使用正则表达式作为分隔符

import java.util.Scanner;public class DelimiterExample {public static void main(String[] args) {String data = "Hello,World|Java-Programming";// 使用正则表达式设置多个分隔符Scanner scanner = new Scanner(data);scanner.useDelimiter("[,|\\-]");  // 逗号、竖线或连字符while (scanner.hasNext()) {System.out.println(scanner.next());}scanner.close();}
}
 

2. 正则表达式匹配特定模式

import java.util.Scanner;public class RegexMatchingExample {public static void main(String[] args) {String input = "ID:1001 Name:Alice Age:25";Scanner scanner = new Scanner(input);// 匹配数字模式while (scanner.hasNext()) {if (scanner.hasNextInt()) {System.out.println("数字: " + scanner.nextInt());} else {System.out.println("文本: " + scanner.next());}}scanner.close();}
}
 

五、常见问题与解决方案

1. next () 与 nextLine () 混用导致的问题

Scanner scanner = new Scanner(System.in);System.out.print("请输入一个数字: ");
int num = scanner.nextInt();  // 读取数字,但不读取换行符System.out.print("请输入一行文本: ");
String line = scanner.nextLine();  // 读取残留的换行符,导致直接跳过输入System.out.println("数字: " + num);
System.out.println("文本: " + line);scanner.close();
 

解决方案:在nextInt()等方法后手动消耗换行符:
int num = scanner.nextInt();
scanner.nextLine();  // 消耗残留的换行符
String line = scanner.nextLine();  // 正常读取下一行
 

2. 资源泄漏问题

若不关闭Scanner,会导致底层输入流未释放,造成资源泄漏。建议使用try-with-resources语句自动关闭:
 
 
try (Scanner scanner = new Scanner(System.in)) {// 使用scanner读取数据String input = scanner.nextLine();System.out.println("输入: " + input);
}  // 自动关闭scanner
 

六、Scanner 类与其他输入方式的对比

方式适用场景特点
Scanner 复杂格式输入解析 灵活的分隔符设置、支持正则匹配、自动类型转换
BufferedReader 高效读取大量文本 基于字符缓冲,性能更高,但仅支持字符串读取
Console 安全读取密码等敏感信息 直接与系统控制台交互,输入密码时不显示明文
System.in 底层字节流操作 最基本的输入流,需手动处理编码和转换

七、最佳实践

  1. 及时关闭资源:使用try-with-resources确保Scanner自动关闭
  2. 注意输入缓冲:混用next()系列方法与nextLine()时,手动处理换行符
  3. 合理选择分隔符:通过useDelimiter()优化复杂格式的解析
  4. 验证输入类型:使用hasNextInt()等方法验证输入类型,避免异常
  5. 避免重复创建对象:在同一输入源的多次读取中复用Scanner实例

通过掌握Scanner类的核心功能与最佳实践,开发者可以高效处理各种输入场景,提升代码的健壮性与灵活性
http://www.jsqmd.com/news/461279/

相关文章:

  • ‘养虾‘和‘训虾‘有什么区别?深度解析
  • OpenClaw有官方操作界面吗?长什么样?深度解析
  • 什么是Amdahl定律?如果你优化了PHP-FPM的某个模块,如何衡量这个优化对整个系统性能的提升?
  • 基础科学几乎停滞,谁限制人类发展?科学家的猜测或许是正确的(视频脚本)
  • 并发和并行的区别是什么?在PHP-FPM的多进程模型中,是并发还是并行?
  • 周鸿祎说OpenClaw还有三个问题没解决,是哪三个?深度解析
  • python flask django外卖点餐配送系统网站设计和实现 员工
  • Python基于flask某公司员工酬薪工资管理系统
  • OpenClaw是哪个公司开发的?是国产软件吗?深度解析
  • Python基于flask程序员薪资工资分析系统爬虫可视化
  • 用OpenClaw能实现‘一人公司‘是什么意思?深度解析
  • AI营销新纪元:如何选择靠谱的人工智能服务商,实现业绩指数级增长?
  • “python”命令不可用
  • 普通人要不要养“龙虾”(视频)
  • AI Coding 工具 Trae 的简单实践
  • 推荐下江苏做机械标准件库的服务商|企业选型实用指南 - 冠顶工业设备
  • 2026年3月红光治疗仪品牌推荐排行榜:基于安全与效能的五大品牌深度对比 - 十大品牌推荐
  • 2026年3月红光治疗仪品牌推荐榜:基于临床数据与安全标准的深度对比评测 - 十大品牌推荐
  • No178:AI中国故事-对话范雎——远交近攻与AI战略:分化击破与目标聚焦
  • 2026年3月红光治疗仪品牌推荐排行榜:基于安全与效能的五大品牌深度对比与评测 - 十大品牌推荐
  • 工程设计类学习(DAY19):低压电源防雷:GDT选型与应用全解析
  • 2026年3月红光治疗仪品牌推荐排行榜:基于临床数据与安全标准的深度对比评测 - 十大品牌推荐
  • 『NAS』一句话生成网页,在NAS部署UPage
  • python flask django社区门户网站帮扶邻里服务平台可视化
  • 2026年3月沥青厂家综合实力对比与推荐排行榜:五家优质供应商深度解析 - 十大品牌推荐
  • 毕业设计_包装机推包机构设计(说明书+CAD图纸+开题报告+任务书+计划周记进度检查表……)
  • 2026年评价高的减速板公司推荐:减速板生产厂家推荐 - 品牌宣传支持者
  • 2026年3月红光治疗仪品牌推荐排行榜:五大品牌深度对比与科学选择指南 - 十大品牌推荐
  • 2026年3月沥青厂家综合实力对比与推荐排行榜:五大优质供应商深度解析 - 十大品牌推荐
  • 2026年评价高的短视频运营公司推荐:唐山短视频运营培训公司精选 - 品牌宣传支持者