TL; DR: Không có cú pháp đặc biệt, chỉ là một hàm
Kotlin, trái ngược với Java, không có cú pháp đặc biệt nào cho việc này. Thay vào đó, try-with-resource , được cung cấp dưới dạng hàm thư viện chuẩn use
.
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
Việc use
thực hiện
@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()
}
}
}
Hàm này được định nghĩa là một phần mở rộng chung trên tất cả các Closeable?
loại. Closeable
là giao diện của Java cho phép dùng thử với các tài nguyên kể từ Java SE7 .
Hàm lấy một hàm theo nghĩa đen block
được thực thi trong a try
. Giống như với tài nguyên thử với Java, tài khoản Closeable
được đóng trong a finally
.
Ngoài ra những thất bại xảy ra bên trong block
dẫn đến các close
vụ hành quyết, trong đó các trường hợp ngoại lệ có thể bị "triệt tiêu" theo nghĩa đen chỉ bằng cách bỏ qua chúng. Điều này khác với thử tài nguyên , bởi vì các ngoại lệ như vậy có thể được yêu cầu trong giải pháp của Java .
Làm thế nào để sử dụng nó
Phần use
mở rộng có sẵn trên bất kỳ Closeable
loại nào , tức là luồng, người đọc, v.v.
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
Phần trong dấu ngoặc móc là những gì trở nên block
trong use
(một lambda được thông qua như là một cuộc tranh cãi ở đây). Sau khi khối được hoàn thành, bạn có thể chắc chắn rằng nó FileInputStream
đã được đóng lại.