TL; DR: нет специального синтаксиса, только функция
В отличие от Java, Kotlin не имеет специального синтаксиса для этого. Вместо этого в качестве стандартной функции библиотеки предлагается try-with-resourcesuse .
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 .
Функция принимает литерал функции, blockкоторый выполняется в try. То же самое с примеркой с-ресурсами в Java, то 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в use(лямбда передается в качестве аргумента здесь). После того, как блок сделан, вы можете быть уверены, что FileInputStreamон был закрыт.