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
он был закрыт.