#kotlin
Вопрос:
Я знаю, что Files.newDirectoryStream(directory).use { ... }
это автоматически закроет поток, как только функция в фигурных скобках будет завершена.
Будет ли поток также закрыт, если я использую .forEach { ... }
вместо .use { ... }
этого ?
Ответ №1:
Это скорее вопрос Java, чем вопрос Kotlin, поскольку он касается метода, определенного в Java API. Котлин позволяет использовать forEach
здесь , потому DirectoryStream
что есть an Iterable
, который определяет forEach
, но это не закрывает этот поток.
Как задокументировано на DirectoryStream
:
A
DirectoryStream
открывается при создании и закрывается путем вызова метода close. Закрытие потока каталогов освобождает все ресурсы, связанные с потоком. Неспособность закрыть поток может привести к утечке ресурсов. Инструкция try-with-resources предоставляет полезную конструкцию для обеспечения того, чтобы поток был закрыт […]
Другими словами, когда вы используете поток каталогов, вы несете ответственность за его закрытие. Это означает, что в Java вам нужно использовать try-with-resources (или явно вызвать close), в Kotlin это означает, что вы должны использовать use
:
Files.newDirectoryStream(directory).use {
it.forEach { ... }
}