1. 简介
本文将简单粗暴地展示在 Java 中如何通过控制台进行用户输入与输出操作。
我们会先看看 Scanner
类的几种常用方法来处理输入,再用 System.out
做一些基础的输出演示。
最后,还会介绍从 Java 6 开始提供的 Console
类,它能更安全、更灵活地处理控制台的读写任务。
⚠️ 注意:本文面向有一定 Java 基础的开发者,像
System.out.println()
这种基础用法就不展开讲了,直接上实战技巧。
2. 从 System.in 读取输入
最常见的方式是使用 java.util.Scanner
,通过包装 System.in
来读取用户输入:
Scanner scanner = new Scanner(System.in);
✅ 常用读取方法
nextLine()
:读取一整行(直到回车),返回String
next()
:读取下一个“单词”(以空白符分隔)nextInt()
/nextDouble()
:直接读取对应类型的数值
示例代码:
String nameSurname = scanner.nextLine(); // 读整行
String gender = scanner.next(); // 读单个词
int age = scanner.nextInt(); // 读整数
double height = scanner.nextDouble(); // 读浮点数
✅ 输入校验:hasNext 系列方法
为了避免程序因非法输入崩溃,可以用 hasNextXxx()
先判断:
while (scanner.hasNextInt()) {
int nmbr = scanner.nextInt();
System.out.println("Valid integer: " + nmbr);
}
也可以自定义正则匹配:
if (scanner.hasNext(Pattern.compile("www\\.baeldung\\.com"))) {
System.out.println("Found Baeldung URL!");
}
✅ 踩坑提醒:
nextLine()
和nextInt()
混用时容易“吞掉”换行符!
比如调用nextInt()
后紧接着nextLine()
,会直接返回空字符串。
解决方案:在nextInt()
后手动加一次scanner.nextLine()
清空缓冲区。
✅ 替代方案:BufferedReader + InputStreamReader
如果你追求性能或处理大量输入,可以用更底层的方式:
BufferedReader buffReader = new BufferedReader(new InputStreamReader(System.in));
int i = Integer.parseInt(buffReader.readLine());
✅ 优势:
- 性能更高,适合竞赛或高频输入场景
- 支持按行读取,天然避免 token 问题
❌ 缺点:
- 需要手动处理异常(
IOException
) - 不像
Scanner
那样提供便捷的类型解析
3. 向 System.out 写入输出
System.out
是 PrintStream
的实例,属于标准输出流。虽然简单,但也有几个细节要注意。
✅ 常用输出方法
System.out.println("Please enter your name and surname: ");
println()
:打印并换行print()
:只打印不换行
示例:
System.out.print("Have a good");
System.out.print(" one!");
输出结果为:
Have a good one!
✅ 小技巧:组合使用
print()
可以构造动态提示信息,比如进度条或实时状态更新。
4. 使用 Console 类进行输入输出(推荐用于敏感信息)
从 Java 6 开始,java.io.Console
提供了更专业的控制台交互方式,尤其适合处理密码等敏感数据。
✅ 获取 Console 实例
Console console = System.console();
⚠️ 注意:该方法可能返回
null
—— 比如在某些 IDE 或非交互式环境中运行时。
使用前务必判空:
if (console == null) {
System.err.println("Console not available!");
return;
}
✅ 安全读取:readLine 与 readPassword
String progLanguauge = console.readLine("Enter your favourite programming language: ");
上面这行代码会:
- 先输出提示语
- 然后等待用户输入
- 回车后返回输入内容(不包含换行符)
对于密码类输入:
char[] pass = console.readPassword("To finish, enter password: ");
✅ 关键优势:
- 输入过程中不会回显字符(星号也不显示),防止肩窥
- 返回
char[]
而非String
,便于及时清空内存,降低敏感信息泄露风险
✅ 最佳实践:用完密码后立即清空数组
Arrays.fill(pass, '\0');
✅ 格式化输出:printf
Console
也支持格式化输出:
console.printf("%s is very interesting!\n", progLanguauge);
功能类似于 System.out.printf
,但语义更清晰,表明这是控制台专用操作。
5. 总结
方式 | 适用场景 | 推荐指数 |
---|---|---|
Scanner + System.in |
快速原型、教学、简单 CLI 工具 | ⭐⭐⭐⭐ |
BufferedReader + InputStreamReader |
高频输入、性能敏感场景 | ⭐⭐⭐⭐☆ |
Console |
处理密码、需要专业控制台交互 | ⭐⭐⭐⭐⭐ |
✅ 综合建议:
- 日常开发用
Scanner
足够,简单易懂 - 写工具脚本或需要隐藏密码时,优先考虑
Console
- 刷算法题或处理大输入量,上
BufferedReader
所有示例代码已托管至 GitHub:https://github.com/example-user/java-console-demo