TL;DR:没有特殊的语法,只是一个函数
Kotlin 与 Java 不同,对此没有特殊的语法。相反,try-with-resources是作为标准库函数提供的use
。
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
use
实施_
@InlineOnly
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
var closed = false
try {
return block(this)
} catch (e: Exception) {
closed = true
try {
this?.close()
} catch (closeException: Exception) {
}
throw e
} finally {
if (!closed) {
this?.close()
}
}
}
此函数被定义为所有Closeable?
类型的通用扩展。Closeable
是 Java 的接口,它允许从 Java SE7开始使用try-with-resources。
该函数采用函数字面量,该字面量在. 与Java 中的try-with-resources相同,在.
block
try
Closeable
finally
内部发生的故障block
也会导致close
执行,在这种情况下,可能的异常实际上是通过忽略它们来“抑制”的。这与try-with-resources不同,因为可以在Java的解决方案中请求此类异常。
如何使用它
该use
扩展适用于任何Closeable
类型,即流、阅读器等。
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
大括号中的部分是block
in use
(这里将 lambda 作为参数传递)。块完成后,可以确定FileInputStream
已经关闭。