TL; DR: Pas de syntaxe spéciale, juste une fonction
Kotlin, contrairement à Java, n'a pas de syntaxe spéciale pour cela. Au lieu de cela, try-with-resources est proposé comme fonction de bibliothèque standard use.
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
Les useimplémentations
@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()
}
}
}
Cette fonction est définie comme une extension générique sur tous les Closeable?types. Closeableest l' interface de Java qui permet d' essayer avec des ressources à partir de Java SE7 .
La fonction prend une fonction littérale blockqui est exécutée dans un fichier try. Comme avec try-with-resources en Java, le Closeablese ferme dans unfinally .
Les échecs qui se produisent à l'intérieur blockmènent également à des closeexécutions, où les exceptions possibles sont littéralement "supprimées" en les ignorant simplement. Ceci est différent de try-with-resources , car de telles exceptions peuvent être demandées dans la solution Java .
Comment l'utiliser
L' useextension est disponible sur n'importe quel Closeabletype, c'est-à-dire les flux, les lecteurs, etc.
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
La partie entre accolades est ce qui devient blockin use(un lambda est passé comme argument ici). Une fois le blocage terminé, vous pouvez être sûr qu'il FileInputStreama été fermé.