在Kotlin试用资源

当我试图在Kotlin中编写一个与try-with-resources代码相同的代码时,它并不适用于我。

我尝试了以下的不同变化:

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

但是都没有用。

有谁知道应该用什么来代替? 显然Kotlin语法没有这样的构造的定义 ,但可能是我失去了一些东西。 它为try块定义语法如下:

 try : "try" block catchBlock* finallyBlock?; 

在kotlin stdlib( src )中有usefunction。

如何使用它:

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

编辑 :以下响应仍然适用于Kotlin 1.0.x. 对于Kotlin 1.1,支持一个标准的库,其目标是支持可closures资源模式的Java 8。

对于不支持“使用”function的其他类,我已经做了以下自制的试用资源:

 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) } } 

改用use

Kotlin对此没有特殊的语法。 相反, 试用资源是作为标准库函数use

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? types。 Java的接口是可以Closeable的,它允许从Java SE7开始 尝试使用资源
该函数采取一个函数文字blocktry执行。 与Java中的try-with-resources一样CloseableCloseableclosures

block失败也会导致执行的结束,在可能的情况下,exception只是被忽略而忽略。 尝试资源不同 ,因为可以在Java解决scheme中请求这样的exception。

如何使用

use扩展可用于任何可Closeabletypes,即stream,读取器等。

 FileInputStream("filename").use { //use your stream by referring to `it` or explicitly give a name. } 

{}的部分是use block (将lambda作为parameter passing)。 块完成后,您可以确定, FileInputStream已closures。