调用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
相关产品推荐
相关产品推荐

