Автоматически ли forEach { } закрывает поток?

#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 { ... }
}