在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
相关产品推荐
相关产品推荐

