TL;DR: No special syntax, just a function
Kotlin, as opposed to Java, does not have a special syntax for this. Instead, try-with-resources, is offered as the standard library function use
.
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
The use
implementations
@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()
}
}
}
This function is defined as a generic extension on all Closeable?
types. Closeable
is Java's interface that allows try-with-resources as of Java SE7.
The function takes a function literal block
which gets executed in a try
. Same as with try-with-resources in Java, the Closeable
gets closed in a finally
.
Also failures happening inside block
lead to close
executions, where possible exceptions are literally "suppressed" by just ignoring them. This is different from try-with-resources, because such exceptions can be requested in Java‘s solution.
How to use it
The use
extension is available on any Closeable
type, i.e. streams, readers and so on.
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
The part in curly brackets is what becomes block
in use
(a lambda is passed as an argument here). After the block is done, you can be sure that FileInputStream
has been closed.