Kotlin输入输出
外观
Kotlin输入输出(I/O)是程序与外部环境交互的基础操作,包括从控制台读取输入、向控制台输出数据以及文件读写操作。本文将详细介绍Kotlin中的标准I/O操作和文件I/O操作,适合初学者和需要复习核心概念的高级开发者。
标准输入输出[编辑 | 编辑源代码]
Kotlin通过标准库提供简洁的I/O操作函数,主要依赖以下方法:
- 输出:`print()`和`println()`
- 输入:`readLine()`、`readln()`和`Scanner`类
控制台输出[编辑 | 编辑源代码]
使用`print()`和`println()`函数向控制台输出内容,后者会在输出后追加换行符。
fun main() {
print("Hello, ") // 不换行
println("Kotlin!") // 自动换行
println("1 + 2 = ${1 + 2}") // 字符串模板
}
输出:
Hello, Kotlin! 1 + 2 = 3
控制台输入[编辑 | 编辑源代码]
Kotlin提供多种输入方式:
1. readLine()[编辑 | 编辑源代码]
读取整行输入(返回可空String类型):
fun main() {
print("Enter your name: ")
val name = readLine()
println("Hello, $name!")
}
输入/输出示例:
Enter your name: Alice Hello, Alice!
2. readln()[编辑 | 编辑源代码]
Kotlin 1.6+引入的非空版本(直接返回String):
val age = readln().toInt() // 直接转换为整型
3. Scanner类[编辑 | 编辑源代码]
适合需要解析特定数据类型时使用:
import java.util.Scanner
fun main() {
val scanner = Scanner(System.`in`)
print("Enter 3 numbers: ")
val a = scanner.nextInt()
val b = scanner.nextDouble()
val c = scanner.nextBoolean()
println("You entered: $a, $b, $c")
}
输入/输出示例:
Enter 3 numbers: 42 3.14 true You entered: 42, 3.14, true
文件I/O操作[编辑 | 编辑源代码]
Kotlin通过扩展函数简化了Java的文件操作API。
写入文件[编辑 | 编辑源代码]
import java.io.File
fun main() {
// 方式1:直接写入字符串
File("data.txt").writeText("Hello\nKotlin")
// 方式2:追加内容
File("data.txt").appendText("\nMore text")
// 方式3:逐行写入集合
val lines = listOf("First", "Second", "Third")
File("lines.txt").writeLines(lines)
}
读取文件[编辑 | 编辑源代码]
fun main() {
// 读取为单个字符串
val content = File("data.txt").readText()
println(content)
// 按行读取为List
val lines = File("lines.txt").readLines()
lines.forEachIndexed { i, line -> println("${i + 1}: $line") }
// 使用useLines处理大文件(自动关闭资源)
File("large.txt").useLines { seq ->
seq.take(5).forEach(::println)
}
}
高级I/O操作[编辑 | 编辑源代码]
缓冲读写[编辑 | 编辑源代码]
对于性能敏感场景,应使用缓冲流:
File("data.bin").outputStream().buffered().use {
it.write("Binary data".toByteArray())
}
File("data.bin").inputStream().buffered().use {
println(it.readBytes().toString(Charsets.UTF_8))
}
序列化/反序列化[编辑 | 编辑源代码]
结合Kotlin序列化库处理结构化数据:
@Serializable
data class Person(val name: String, val age: Int)
fun main() {
val person = Person("Bob", 25)
// 序列化为JSON
val json = Json.encodeToString(person)
File("person.json").writeText(json)
// 从JSON反序列化
val loaded = Json.decodeFromString<Person>(File("person.json").readText())
println(loaded)
}
实际应用案例[编辑 | 编辑源代码]
案例1:配置文件处理器[编辑 | 编辑源代码]
fun loadConfig(path: String): Map<String, String> {
return File(path).readLines()
.filter { it.isNotBlank() && !it.startsWith("#") }
.associate {
val (key, value) = it.split("=", limit = 2)
key.trim() to value.trim()
}
}
fun saveConfig(path: String, config: Map<String, String>) {
File(path).writeText(
config.entries.joinToString("\n") { "${it.key}=${it.value}" }
)
}
案例2:日志记录器[编辑 | 编辑源代码]
class FileLogger(private val file: File) {
init {
if (!file.exists()) file.createNewFile()
}
fun log(message: String) {
file.appendText("${LocalDateTime.now()}: $message\n")
}
}
性能考虑[编辑 | 编辑源代码]
通过流程图展示文件处理的最佳实践:
数学公式示例[编辑 | 编辑源代码]
当处理二进制数据时,可能需要计算校验和:
总结[编辑 | 编辑源代码]
Kotlin通过以下方式简化I/O操作:
- 标准I/O:`println()`/`readLine()`快速实现控制台交互
- 文件操作:扩展函数使文件读写更符合Kotlin习惯
- 流处理:提供资源自动管理(`use`块)和缓冲优化
- 类型安全:与Kotlin特性(如空安全、扩展函数)深度集成
建议开发者根据数据规模选择合适的I/O方式,并始终注意资源释放问题。