You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Kotlin中使用缓冲区写入文件并返回File对象的问题

在Kotlin中使用缓冲区写入文件并返回File对象的问题

嘿,这个问题我太懂啦!你现在的代码编译失败,核心原因是bufferedWriter().use { ... }这个表达式的返回值是你在use代码块里最后一行的结果,而你现在的块里没有返回File对象,和函数声明的返回类型File不匹配,所以编译器报错了。

给你两个简单的解决方案,都能完美解决这个问题,还能保证资源被正确释放:

方案一:先保存File实例,操作后直接返回

这种方法最直观,先把要创建的File对象存在变量里,然后用use块完成写入操作,最后返回这个变量就行:

fun List<Contact>.buildCsv(): File {
    val csvFile = File("people.csv")
    csvFile.bufferedWriter(Charsets.ISO_8859_1).use { out ->
        out.write("a,b,c,d\n")
        this.forEach {
            out.write(it.toString())
        }
    }
    return csvFile
}

use块依然会帮你自动关闭bufferedWriter,完全不用担心资源泄漏的问题,写完直接返回预先创建好的File实例就搞定了。

方案二:用apply链式调用(更符合Kotlin风格)

如果你喜欢Kotlin的链式写法,可以用apply函数,它会返回调用它的原对象(也就是我们的File),在apply块里完成写入操作:

fun List<Contact>.buildCsv(): File {
    return File("people.csv").apply {
        bufferedWriter(Charsets.ISO_8859_1).use { out ->
            out.write("a,b,c,d\n")
            // 注意这里用this@apply来引用外层的List<Contact>对象,避免和apply里的File对象混淆
            this@apply.forEach {
                out.write(it.toString())
            }
        }
    }
}

这个写法更紧凑,整个表达式的返回值就是我们创建的File对象,同样能保证资源被正确管理。

两种方法都能达到你的需求,选哪个全看你个人的代码风格偏好啦~

备注:内容来源于stack exchange,提问作者pbuchheit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:48:04