java中从键盘读取用户输入最常用、最推荐的方式是用scanner包装system.in,因其封装缓冲、分词、类型解析和异常处理,比直接操作system.in.read()更高效安全;需注意nextint()后调用nextline()吸收换行符、及时close及设置ide终端utf-8编码。

Java中从键盘读取用户输入,最常用、最推荐的方式是配合 System.in 与 Scanner 类。注意:System.in 本身是 InputStream,不能直接读字符串;必须包装成 Scanner(或其他字符流处理器)才能方便地按行、按词、按数字解析输入。
为什么用 Scanner 而不是直接操作 System.in
System.in.read() 只能逐字节读取,处理换行、空格、类型转换(如把"123"转成 int)都得手动实现,极易出错且冗长。Scanner 封装了缓冲、分词、类型解析和异常处理逻辑,一行代码就能读整行或一个整数,开发效率高、可读性强。
基础用法:创建 Scanner 并读取不同类型数据
创建 Scanner 对象时传入 System.in,之后调用对应方法即可:
-
读取一整行(含空格):
scanner.nextLine()—— 注意:它会消费掉换行符,若前面用了 nextInt() 等方法,需额外调用一次 nextLine() 吸收残留换行符 -
读取下一个单词(以空白符分隔):
scanner.next()—— 遇到空格/制表符/回车就停,不包含这些分隔符 -
读取整数:
scanner.nextInt()—— 若输入非数字会抛InputMismatchException,建议配合hasNextInt()预检 -
读取浮点数、布尔值等:对应有
nextDouble()、nextBoolean()等,同理支持hasNextXxx()判断
常见陷阱与应对建议
新手常踩的几个坑,提前避开能少调试半小时:
-
nextInt() + nextLine() 组合导致 nextLine() 读空行:因为
nextInt()只读数字,不读后续换行符,nextLine()立即读到那个换行就返回空串。解决方法:在nextInt()后加一句scanner.nextLine();清掉换行符 -
Scanner 不关闭也可能引发问题:虽然控制台输入一般不会泄漏资源,但养成习惯——在输入结束后调用
scanner.close();若后续还要继续读,就别关 - 中文输入正常,但 IDE 控制台有时编码异常:确保 IDE 的终端编码为 UTF-8(如 IntelliJ 在 Settings → Editor → File Encodings 中设置 Console Encoding),避免乱码
一个完整示例:读姓名、年龄、是否学生
演示典型交互场景,含基本校验:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入姓名:");
String name = scanner.nextLine(); // 允许姓名含空格
System.out.print("请输入年龄:");
while (!scanner.hasNextInt()) {
System.out.print("请输入有效整数:");
scanner.next(); // 跳过非法输入
}
int age = scanner.nextInt();
scanner.nextLine(); // 吸收换行符
System.out.print("是否为学生?(true/false):");
boolean isStudent = scanner.nextBoolean();
System.out.printf("你好,%s,%d岁,学生状态:%b%n", name, age, isStudent);
scanner.close();
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











