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.outPrintStream 的实例,属于标准输出流。虽然简单,但也有几个细节要注意。

✅ 常用输出方法

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


原始标题:Read and Write User Input in Java