跳转到内容

Kotlin输入输出

来自代码酷
Admin留言 | 贡献2025年5月2日 (五) 00:21的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)


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")
    }
}

性能考虑[编辑 | 编辑源代码]

通过流程图展示文件处理的最佳实践:

graph TD A[开始I/O操作] --> B{操作类型} B -->|小文件| C[直接readText/writeText] B -->|大文件| D[使用缓冲流] B -->|行处理| E[useLines] C --> F[完成] D --> F E --> F

数学公式示例[编辑 | 编辑源代码]

当处理二进制数据时,可能需要计算校验和: Checksum=i=1n(byteimod256)

总结[编辑 | 编辑源代码]

Kotlin通过以下方式简化I/O操作:

  • 标准I/O:`println()`/`readLine()`快速实现控制台交互
  • 文件操作:扩展函数使文件读写更符合Kotlin习惯
  • 流处理:提供资源自动管理(`use`块)和缓冲优化
  • 类型安全:与Kotlin特性(如空安全、扩展函数)深度集成

建议开发者根据数据规模选择合适的I/O方式,并始终注意资源释放问题。