为什么在 Kotlin 中处理文件并不痛苦
想象一下:您正在编写一个应用程序,需要保存用户设置、记录错误或处理包含数千行数据的 CSV 文件。在 Java 中,这需要用到几十个类,如 BufferedReader、FileWriter 以及无尽的 try-catch。那 Kotlin 呢?这个由 JetBrains 创建的语言不仅仅是“简化”了 Java——它重新定义了对数据的处理方式。在这里,打开文件只需一行代码,错误处理也优雅得多。
在本文中,我们将从基本操作到高级技术,全面解析 Kotlin 中的文件与文件系统操作。您将学习如何读写文件、管理目录、处理 JSON 和 CSV,以及避免常见错误。准备好了吗?让我们开始吧!
基础:Kotlin 如何简化 Java IO
Kotlin 的一大亮点是扩展函数。您无需编写几十行代码来读取文件,只需使用一个函数 .readText() 或 .readLines()。让我们来看一些具体示例。
读取整个文件
读取文本文件最简单的方法是使用 readText()。此方法返回包含文件内容的字符串。重要提示:读取后文件会自动关闭。
import java.io.File
fun main() { val content = File("example.txt").readText() println(content)}如果文件很大,最好逐行读取:
val lines = File("example.txt").readLines()lines.forEach { line -> println(line) }如果需要以流的方式读取(例如,处理大型日志):
File("example.txt").useLines { lines -> lines.forEach { line -> // 处理每一行 println(line) }}请注意 useLines()——这个函数能确保在代码块执行完毕后自动关闭资源。这看起来像魔法,但实际上它类似于 Java 中的 try-with-resources,只是写法更简洁。
写入文件
在 Kotlin 中写入数据也非常直观。以下是三种方式:
// 1. 覆盖文件File("output.txt").writeText("你好,世界!")
// 2. 追加到文件末尾File("output.txt").appendText("新的一行")
// 3. 写入字符串列表val list = listOf("行1", "行2", "行3")File("output.txt").writeText(list.joinToString(""))顺便提一下,如果您处理的是二进制数据(如图片、压缩包),请使用 writeBytes() 和 readBytes():
val imageBytes = File("image.png").readBytes()// 处理字节...File("copy.png").writeBytes(imageBytes)文件系统管理:创建、删除、移动
Kotlin 并没有重新发明轮子,但它让文件系统操作变得更加便捷。所有操作都可以通过带有扩展的 java.io.File 类来完成。
创建目录
要创建一个目录(如果父目录不存在,则一并创建):
val dir = File("data/logs/2024")val created = dir.mkdirs() // 如果创建成功则返回 trueprintln("目录已创建:$created")请注意:mkdir() 只创建最后一级文件夹,而 mkdirs() 会创建整个路径。
检查存在性及删除
val file = File("temp.txt")if (file.exists()) { if (file.delete()) { println("文件已删除") } else { println("删除失败") }}
// 递归删除目录File("data").deleteRecursively()请谨慎使用 deleteRecursively()——这是一个不可逆的操作。请再三确认您删除的是正确数据。
移动和复制
val source = File("old.txt")val target = File("new_dir/new.txt")
// 移动(重