Kotlin文件处理简洁之道:从读写到目录遍历
Java的文件IO虽然功能完善,但每次读写都需要手动构建输入输出流、处理字节转换,代码量不小。Kotlin在标准库中对Java的java.io.File进行了大量扩展,提供了一系列语义清晰、一行即可完成常见操作的方法,大幅提升了文件处理的开发效率。
写入文本数据,直接调用writeText即可覆盖已有内容;若需在文件末尾追加,可使用appendText:
val target = File("/sdcard/note.txt")
target.writeText("覆盖写入的内容")
target.appendText("\n追加一行")
对于图像等二进制数据,可以借助writeBytes一次性写入字节数组,但若涉及压缩参数(如JPEG质量),则需要依赖输出流。Kotlin提供的File.outputStream()能够直接获取流对象,配合use扩展自动关闭资源:
fun savePicture(bitmap: Bitmap, path: String) {
File(path).outputStream().use { out ->
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out)
}
}
读取方面同样简洁。读取全部文本内容使用readText(),按行读取返回List<String>则用readLines(),获取字节数组可用readBytes()。例如读取纯文本:
val content = File("/sdcard/note.txt").readText()
解析图片文件则更为灵活。可以通过字节数组结合BitmapFactory:
val data = File("/sdcard/photo.jpg").readBytes()
val bitmap = BitmapFactory.decodeByteArray(data, 0, data.size)
或者利用输入流:
val stream = File("/sdcard/photo.jpg").inputStream()
val bitmap = BitmapFactory.decodeStream(stream)
stream.close()
更直接的方式是使用BitmapFactory.decodeFile,路径直达:
val bitmap = BitmapFactory.decodeFile("/sdcard/photo.jpg")
当需要遍历文件夹查找特定类型文件时,Kotlin提供了FileTreeWalk来构建文件树,通过链式设置深度、过滤器等条件完成筛选。例如找出当前目录下的.txt文件:
val results = mutableListOf<String>()
File(baseDir).walk().apply {
maxDepth(1)
}.filter { it.isFile }
.filter { it.extension == "txt" }
.forEach { results.add(it.name) }
若要同时匹配多种扩展名(如png和jpg),使用in条件更加优雅:
val images = mutableListOf<String>()
File(baseDir).walk().apply {
maxDepth(1)
}.filter { it.isFile }
.filter { it.extension in listOf("png", "jpg") }
.forEach { images.add(it.name) }
利用这些扩展函数和FileTreeWalk,文件操作与目录遍历不再需要冗长的模板代码,开发者可以专注于业务逻辑的实现。