Files.walk(),计算总大小

Files.walk(),计算总大小,第1张

Files.walk(),计算总大小

不,无法避免此异常。

异常本身发生在的懒惰获取中

Files.walk()
,因此,为什么不及早看到它以及为什么没有办法规避它,请考虑以下代码:

long size = Files.walk(Paths.get("C://"))        .peek(System.out::println)        .mapToLong(this::count)        .sum();

在我的系统上,这将在我的计算机上打印:

C:C:$Recycle.BinException in thread "main" java.io.UncheckedIOException: java.nio.file.AccessDeniedException: C:$Recycle.BinS-1-5-18

并且作为第三个文件的(主)线程上抛出的异常,该线程上的所有进一步执行都将停止。

我认为这是一个设计失败,因为从现在开始它

Files.walk
是绝对不可用的,因为您永远无法保证遍历目录时不会出现任何错误。

需要注意的重要一点是stacktrace包含

sum()
reduce()
*** 作,这是因为路径是延迟加载的,所以在的点
reduce()
,调用了大多数流机制(在stacktrace中可见),然后获取路径,此时
UnCheckedIOException
发生。

如果让每个步行 *** 作都在各自的线程上执行,则可能 被规避。但这不是您想做的事情。

另外,检查文件是否实际上可访问是 毫无价值的 (尽管在某种程度上很有用),因为您无法保证甚至在1毫秒后仍可读。

未来扩展

我相信它仍然可以修复,尽管我不知道它是如何

FileVisitOption
工作的。
当前有一个
FileVisitOption.FOLLOW_linkS
,如果它基于每个文件运行,那么我怀疑
FileVisitOption.IGNORE_ON_IOEXCEPTION
也可以添加一个,但是我们无法在其中正确注入该功能。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5175960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-19

发表评论

登录后才能评论

评论列表(0条)

保存