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 usethự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. Closeablelà 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 blockdẫn đến các closevụ 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 usemở rộng có sẵn trên bất kỳ Closeableloạ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 blocktrong 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.