TL; DR: Keine spezielle Syntax, nur eine Funktion
Kotlin hat dafür im Gegensatz zu Java keine spezielle Syntax. Stattdessen wird Try-with-Resources als Standardbibliotheksfunktion angeboten use.
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
Die useImplementierungen
@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()
}
}
}
Diese Funktion ist als generische Erweiterung für alle Closeable?Typen definiert. Closeableist Javas Schnittstelle , die das Testen mit Ressourcen ab Java SE7 ermöglicht .
Die Funktion nimmt eine Funktionsliteral , blockdie in einem ausgeführt wird try. Das gleiche wie mit Try-mit-Ressourcen in Java, der Closeablewird geschlossen in einemfinally .
Auch Fehler im Inneren blockführen zu closeAusführungen, bei denen mögliche Ausnahmen buchstäblich "unterdrückt" werden, indem sie einfach ignoriert werden. Dies unterscheidet sich von Try-with-Resources , da solche Ausnahmen in der Java -Lösung angefordert werden können.
Wie man es benutzt
Die useErweiterung ist für jeden CloseableTyp verfügbar , dh für Streams, Reader usw.
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
Der Teil in geschweiften Klammern ist , was wird blockin use(a Lambda wird hier als Argument übergeben). Nachdem der Block fertig ist, können Sie sicher sein, dass FileInputStreamer geschlossen wurde.