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