不,无法避免此异常。
异常本身发生在的懒惰获取中
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也可以添加一个,但是我们无法在其中正确注入该功能。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)