Попытка использования ресурсов в Котлине

Когда я попытался написать эквивалент кода try-with-resources в Котлине, это не сработало для меня.

Я пробовал разные варианты:

try (writer = OutputStreamWriter(r.getOutputStream())) { // ... } 

Но никто не работает.

Кто-нибудь знает, что следует использовать вместо этого? По-видимому, грамматика Котлина не имеет определения для такой конструкции, но может быть, я чего-то не хватает. Он определяет грамматику для блока try следующим образом:

 try : "try" block catchBlock* finallyBlock?; 

    Существует функция- use в kotlin stdlib ( src ).

    Как это использовать:

     OutputStreamWriter(r.getOutputStream()).use { // by `it` value you can get your OutputStreamWriter it.write('a') } 

    Изменить : Следующий ответ по-прежнему действует для Kotlin 1.0.x. Для Kotlin 1.1 поддерживается стандартная библиотека, которая нацеливает java 8 на поддержку закрываемого шаблона ресурса.

    Для других классов, которые не поддерживают функцию «use», я сделал следующие домашние пробные ресурсы:

     package info.macias.kotlin inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R { try { return block(closeable); } finally { closeable.close() } } 

    Затем вы можете использовать его следующим образом:

     fun countEvents(sc: EventSearchCriteria?): Long { return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) { var rs = it.executeQuery() rs.next() rs.getLong(1) } } 

    Используйте вместо этого

    Для этого у Kotlin нет специального синтаксиса. Вместо этого в качестве стандартной функции библиотеки предлагается попробовать-с-ресурсами .

    Реализация 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, который позволяет использовать ресурсы try-with с Java SE7 .
    Функция принимает block литерала функции, который запускается в try . То же, что и при использовании try-with-resources в 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 (в качестве аргумента передается лямбда). После завершения блока вы можете быть уверены, что FileInputStream закрыт.