我知道Files.list(Path)在内部使用Files.newDirectoryStream(Path),基本上只包装了DirectoryStream。
但我不明白,当我想使用第一个或后一个时。
如果我想使用流API,这只是一种方便的方法吗?我自己可以做到这一点相当容易,see this question。
如果查看Files.list
的实现,内部DirectoryStream抛出的异常将包含在UncheckedIOException
中。我应该知道的任何事情吗?
答案 0 :(得分:14)
这通常是一种风格问题。如果要使用外部迭代(for(Path path : dirStream)
),请使用newDirectoryStream
。如果您想利用Stream API操作(例如map
,filter
,sorted
等),请改用list
。
区别在于异常处理。 Files.list
遍历期间发生的任何异常都会从DirectoryIteratorException
转换为UncheckedIOException
。另一个细微差别是分词器明确报告DISTINCT
特征,因此如果您执行Files.list().distinct()
,distinct()
步骤将被优化(因为它已经知道了元素是不同的)。使用Iterable.spliterator()
默认实现时,不会执行此优化。
这里没什么特别的。您可能希望在终端流操作执行过程中弹出UncheckedIOException
(例如,由于访问网络文件夹时网络超时)。