Kotlin逐行读取文件失效及闭包相关警告问题咨询
关于Kotlin同时读写文件及闭包捕获提示的解答
当然可以同时进行文件的读取与写入操作,你遇到的两个提示只是IDE的警告,和同时读写本身没有冲突,下面分别解释并给出修正方案:
关于
output的「值在闭包中被捕获」提示:
你在forEachLine的闭包里使用了外部的output对象,IDE只是提醒你这个外部变量被闭包捕获了。如果output是用val声明的不可变变量,这个警告完全不影响功能;如果是var声明的可变变量,后续外部修改它可能引发线程安全问题,但只要你逻辑上不需要修改它,就无需担心。关于
words的「被包装为引用对象以便在闭包中修改」提示:
你把words声明成了外部的可变变量(var),然后在闭包里给它赋值,Kotlin会自动把它包装成引用对象来保证闭包内的修改能同步到外部。但实际上words只在当前行的处理逻辑里用到,完全没必要放在闭包外面,改成闭包内的局部变量就能消除这个警告,代码逻辑也更清晰。
修正后的代码(还优化了流的自动关闭,避免手动关闭遗漏):
File(inputFile).inputStream().bufferedReader().use { reader -> output.use { writer -> reader.forEachLine { line -> var str = line // 将words改为闭包内的局部变量 val words = line.split(" ").toMutableList() for (word in words) { // 放开注释后注意:replace返回新字符串,需要重新赋值给str // crypt[word]?.let { replacement -> str = str.replace(word, replacement) } println(word) } writer.println(str) } } }
注:
use函数会在代码块执行完毕后自动关闭流,不用再手动调用close(),更安全可靠。
内容的提问来源于stack exchange,提问作者Kripthonite
相关产品推荐
相关产品推荐

