1. 简介

学习一门新语言时,通常都会从控制台输入输出(Console I/O)开始练手。本文将系统介绍在 Kotlin 中处理控制台 I/O 的几种常用方式,帮你少踩坑,写出更健壮的代码。

2. 使用 Kotlin 标准库

Kotlin 标准库基于 JDK 原生 I/O 提供了简洁的扩展函数,日常开发中足够用。

打印输出

使用 print()println() 可以向控制台输出内容:

print("Hello from Kotlin")

终端输出:

Hello from Kotlin

✅ 背后原理:print() 实际调用的是 Java 的 System.out.print(),而 println() 会在末尾自动加上换行符。

读取输入

Kotlin 1.6+ 推荐使用 readln()readlnOrNull() 从标准输入读取一行字符串:

@Test
fun givenInput_whenReadln_thenReadText() {
    val expectedInput = "Hello from Kotlin"
    val input = ByteArrayInputStream(expectedInput.toByteArray())
    System.setIn(input)

    val readText = readln()

    assertThat(readText).isEqualTo(expectedInput)
}

@Test
fun givenInput_whenReadlnOrNull_thenReadText() {
    val expectedInput = "Hello from Kotlin"
    val input = ByteArrayInputStream(expectedInput.toByteArray())
    System.setIn(input)

    val readText = readlnOrNull()

    assertThat(readText).isEqualTo(expectedInput)
}

⚠️ 关键区别:当遇到 EOF(End of File)时:

  • readln() ❌ 抛出 RuntimeException
  • readlnOrNull() ✅ 返回 null

验证测试如下:

@Test
fun givenEofReachedInput_whenReadln_thenThrowsRunTimeException() {
    assertThrows<RuntimeException> { 
        var readText = readln()
    }
}

@Test
fun givenEofReachedInput_whenReadlnOrNull_thenReadNull() {
    val readText = readlnOrNull()
    assertThat(readText).isEqualTo(null)
}

📌 注意事项:

  • readln()readlnOrNull() 仅在 Kotlin 1.6 及以上版本可用
  • 若使用旧版本,请改用 readLine()(注意大小写)
val inputText = readLine()

⚠️ 划重点:readLine() 并不是 Java 中 Scanner.readLine() 的别名,它其实是 BufferedReader.readLine() 的桥接实现,不要搞混!

3. 使用 Java 标准库

得益于出色的 Java 互操作性,Kotlin 可以直接使用 JDK 提供的各类 I/O 工具类。以下是三种常见方案。

3.1. 使用 Scanner 类

Scanner 适合解析结构化输入(如分隔符分割的字段),使用非常直观:

val scanner = Scanner(System.`in`)
val readText = scanner.nextLine()

💡 小技巧:System.in 中的 in 是 Kotlin 关键字,需用反引号 ` 转义。

3.2. 使用 BufferedReader 类

对于高性能文本读取,BufferedReader 更合适,尤其适合处理大文件或频繁读取场景:

val reader = BufferedReader(InputStreamReader(System.`in`))
val readText = reader.readLine()

✅ 优势:缓冲机制减少 I/O 次数,效率更高
❌ 缺点:代码稍显冗长

3.3. 使用 Console 类

Console 类提供了一些高级功能,特别适用于需要安全输入的场景:

val console = System.console()

常用方法包括:

  • console.readLine():读取普通文本
  • console.readPassword():读取密码(不回显)
  • console.printf():格式化输出
val readText = console.readLine()
val password = console.readPassword() // 输入不会显示在屏幕上

⚠️ 注意:System.console() 在某些 IDE 或非终端环境下可能返回 null,使用前务必判空!

4. 总结

方式 适用场景 推荐度
readln() / readlnOrNull() 日常简单输入,Kotlin 风格 ✅✅✅
Scanner 解析格式化输入(如数字、分词) ✅✅
BufferedReader 高性能、大批量输入处理 ✅✅
Console 安全输入(如密码) ✅(特定场景)

📌 最佳实践建议:

  • 新项目优先使用 readlnOrNull() 处理 EOF 更安全
  • 需要解析输入时搭配 Scanner
  • 密码输入务必用 Console.readPassword()
  • 注意运行环境是否支持 Console

🔗 参考资料:Java 中 Scanner、BufferedReader 与 Console 对比详解
💻 示例代码已开源:GitHub - Baeldung Kotlin I/O Examples


原始标题:Console I/O in Kotlin