You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用forEach { } 遍历流时是否会自动关闭流?

结论

不会自动关闭流,直接替换会存在资源泄漏风险。

原因说明

  • use 是 Kotlin 为所有实现了 AutoCloseable 接口的类提供的扩展函数,它的内部逻辑会确保代码块执行结束后(无论正常结束还是抛出异常),自动调用对象的 close() 方法释放资源。DirectoryStream 本身实现了 AutoCloseable 接口,所以搭配 use 是安全的资源管理写法。
  • forEach 是 Kotlin 针对 Iterable 接口提供的遍历扩展函数,DirectoryStream 因为同时实现了 Iterable 所以可以直接调用 forEach,但这个方法的实现逻辑里完全没有自动调用 close() 的设计,遍历完成后流持有的文件句柄不会主动释放,只能等到GC回收时才会被释放,属于不可控的资源回收逻辑,在频繁操作目录、高并发的场景下很容易触发文件句柄耗尽的异常。

正确写法参考

如果需要遍历目录项同时保证资源自动释放,应该把 forEach 放在 use 块内部执行:

Files.newDirectoryStream(directory).use { dirStream ->
    dirStream.forEach { entry ->
        // 你的目录项处理逻辑
    }
}

请不要直接使用 Files.newDirectoryStream(directory).forEach { ... } 这种链式调用写法,一定会造成资源泄漏。

内容的提问来源于stack exchange,提问作者waldrabe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:39:04