上一篇                     
               
			  Java Scanner如何快速读取输入
- 后端开发
- 2025-07-02
- 3401
 Java Scanner类用于读取用户输入或文件数据,导入java.util.Scanner后,创建Scanner对象关联输入源(如System.in),通过next()、nextInt()等方法读取不同类型数据,最后用close()释放资源。
 
创建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章。

 
  
			