Java的Scanner交互功能
Scanner用户交互Scanner是 Java 5 引入的一个工具类位于java.util包主要用于解析基本数据类型和字符串的文本输入。它是处理控制台输入System.in最常用的方式比传统的BufferedReader更简单易用。1. 基本使用步骤导入包import java.util.Scanner;创建对象通常绑定到标准输入流System.in。调用方法使用next数据类型()如nextInt() 方法读取数据。关闭资源使用完毕后调用close()。importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){// 1. 创建 Scanner 对象ScannerscannernewScanner(System.in);// 2. 提示并读取System.out.print(请输入姓名);Stringnamescanner.nextLine();System.out.print(请输入年龄);intagescanner.nextInt();// 3. 关闭资源scanner.close();}}2. 常用读取方法Scanner提供了一系列方法来读取不同类型的数据方法功能跳过空白符读取范围next()读取字符串✅ 是读到下一个空白符空格、回车、Tab为止nextLine()读取一行❌ 否读到行结束符\n或\r\n为止nextInt()读取整数✅ 是读到下一个空白符为止并转换为 intnextDouble()读取小数✅ 是读到下一个空白符为止并转换为 doublehasNext()判断是否有输入-常用于循环读取防止报错3. 核心机制分隔符与缓冲区默认分隔符空白字符空格、制表符、换行符。工作流程从输入流中读取数据到内部缓冲区。根据分隔符将缓冲区内容切割成令牌Token。nextXxx()方法获取下一个令牌并转换类型。next()与nextLine()的区别next()会自动跳过前面的空白符读取有效字符遇到下一个空白符停止。它不会读取回车符。nextLine()读取当前行剩余的所有内容包括空字符串直到遇到回车符它会消耗掉回车符。4. 经典问题在nextInt()后使用nextLine()这是初学者最容易遇到的 Bug。问题场景ScannerscnewScanner(System.in);intagesc.nextInt();// 输入18后回车Stringnamesc.nextLine();// 期望读取姓名但程序直接跳过原因输入18并按下回车缓冲区内容是18\n。nextInt()只读取了18将换行符\n留在了缓冲区。紧接着调用nextLine()时它读取到了残留的\n认为这一行已经结束于是返回空字符串程序不会等待用户输入。解决方案在nextInt()之后额外调用一次nextLine()消费掉残留的换行符。intagesc.nextInt();sc.nextLine();// 消耗掉残留的换行符Stringnamesc.nextLine();// 现在可以正常读取了或者统一全部使用nextLine()读取然后再手动转换类型Integer.parseInt()。5. 资源关闭注意事项一般情况使用完Scanner后应调用scanner.close()释放底层流资源。特殊情况如果Scanner包装的是System.in标准输入通常不建议关闭。因为关闭Scanner会同时关闭底层的System.in流导致后续无法再从控制台读取输入。在简单的算法题或独立程序中关闭与否影响不大。在大型系统或复用代码中尽量避免关闭System.in。6. 性能与替代方案性能Scanner功能强大但效率较低。在处理大规模输入如几十万行数据时可能会超时。替代方案如果需要高性能输入建议使用BufferedReaderStringTokenizer或StreamTokenizer。// 高性能输入示例BufferedReaderbrnewBufferedReader(newInputStreamReader(System.in));Stringlinebr.readLine();7. 总结优点API 简单支持多种数据类型解析自带空格跳过功能。缺点性能较差next系列方法混用容易出错。最佳实践尽量统一使用nextLine()读取所有输入再手动解析避免缓冲区残留问题。读取前最好用hasNext()判断防止NoSuchElementException异常。注意System.in的关闭问题。