Java核心技术·卷Ⅱ:高级特性(原书第10版)
上QQ阅读APP看书,第一时间看更新

2.5.6 访问目录中的项

静态的Files.list方法会返回一个可以读取目录中各个项的Stream<Path>对象。目录是被惰性读取的,这使得处理具有大量项的目录可以变得更高效。

因为读取目录涉及需要关闭的系统资源,所以应该使用try块:

list方法不会进入子目录。为了处理目录中的所有子目录,需要使用File.walk方法。

下面是加压后的src.zip树的遍历样例:

正如你所见,无论何时,只要遍历的项是目录,那么在进入它之前,会继续访问它的兄弟项。

可以通过调用File.walk(pathToRoot,depth)来限制想要访问的树的深度。两种walk方法都具有FileVisitOption...的可变长参数,但是你只能提供一种选项:FOLLOW_LINKS,即跟踪符号链接。

注意:如果要过滤walk返回的路径,并且你的过滤标准涉及与目录存储相关的文件属性,例如尺寸、创建时间和类型(文件、目录、符号链接),那么应该使用find方法来替代walk方法。可以用某个谓词函数来调用这个方法,该函数接受一个路径和一个BasicFileAttributes对象。这样做唯一的优势就是效率高。因为路径总是会被读入,所以这些属性很容易获取。

这段代码使用了Files.walk方法来将一个目录复制到另一个目录:

遗憾的是,你无法很容易地使用Files.walk方法来删除目录树,因为你需要在删除父目录之前必须先删除子目录。下一节将展示如何克服此问题。