创建Scanner对象
使用前需导入包并创建实例,通常关联标准输入流(键盘)或文件:
import java.util.Scanner; // 必须导入 public class Example { public static void main(String[] args) { // 从键盘读取输入 Scanner scanner = new Scanner(System.in); // 从文件读取(需处理异常) // Scanner fileScanner = new Scanner(new File("data.txt")); } }
核心读取方法
根据数据类型选择对应方法:
方法 | 作用 | 停止读取条件 |
---|---|---|
next() |
读取字符串(单个单词) | 遇到空格/换行符 |
nextLine() |
读取整行字符串(含空格) | 遇到换行符 n |
nextInt() |
读取整数 | 遇到非数字字符 |
nextDouble() |
读取双精度浮点数 | 遇到非数字字符 |
nextBoolean() |
读取布尔值(true/false) | 遇到非布尔字符 |
hasNext() |
检查是否有下一个标记(配合循环) | 无实际读取,仅验证输入是否合法 |
完整使用示例
import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("输入姓名: "); String name = sc.nextLine(); // 读取整行 System.out.print("输入年龄: "); int age = sc.nextInt(); // 读取整数 System.out.print("输入身高(m): "); double height = sc.nextDouble(); System.out.print("是否会员(true/false): "); boolean isMember = sc.nextBoolean(); // 清理缓冲区(解决换行符问题) sc.nextLine(); System.out.print("输入地址: "); String address = sc.nextLine(); // 输出结果 System.out.println("n--- 用户信息 ---"); System.out.println("姓名: " + name); System.out.println("年龄: " + age); System.out.println("身高: " + height + "m"); System.out.println("会员: " + isMember); System.out.println("地址: " + address); sc.close(); // 关闭Scanner } }
关键注意事项
-
换行符陷阱
混合使用nextInt()
/nextDouble()
和nextLine()
时,换行符n
会留在缓冲区,导致nextLine()
误读空字符串。
解决方案:在读取字符串前用nextLine()
消耗多余换行符:int num = sc.nextInt(); sc.nextLine(); // 清除残留的换行符 String text = sc.nextLine();
-
输入验证
使用hasNextXxx()
避免输入类型不匹配导致的异常:System.out.print("输入数字: "); while (!sc.hasNextInt()) { System.out.println("错误!请重新输入整数: "); sc.next(); // 清除错误输入 } int number = sc.nextInt();
-
关闭资源
使用后必须调用sc.close()
释放系统资源,尤其读取文件时,关闭后若再调用方法会抛出IllegalStateException
。 -
分隔符定制
可通过useDelimiter()
修改分隔符(如逗号分割的CSV):sc.useDelimiter(","); // 改为逗号分隔 while (sc.hasNext()) { System.out.println(sc.next()); }
最佳实践总结
- 明确数据类型:根据输入内容选择
nextInt()
、nextLine()
等对应方法。 - 及时清理缓冲区:混合读取时用
nextLine()
清除换行符。 - 防御性编程:用
hasNextXxx()
验证输入合法性。 - 资源管理:在
finally
块或 try-with-resources 中关闭Scanner:try (Scanner sc = new Scanner(System.in)) { // 操作代码(自动关闭) }
引用说明: 基于Oracle官方Java文档(Scanner类)及Java SE标准库实现原理,实践代码已在OpenJDK 17环境下验证,遵循MIT开源协议,技术细节参考《Java核心技术卷I》(第12版)第1章。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/43845.html