2.5.6 访问目录中的项
静态的Files.list方法会返回一个可以读取目录中各个项的Stream对象。目录是被惰性读取的,这使得处理具有大量项的目录可以变得更高效。
因为读取目录涉及需要关闭的系统资源,所以应该使用try块:
list方法不会进入子目录。为了处理目录中的所有子目录,需要使用File.walk方法。
下面是加压后的src.zip树的遍历样例:
正如你所见,无论何时,只要遍历的项是目录,那么在进入它之前,会继续访问它的兄弟项。
可以通过调用File.walk(pathToRoot, depth)来限制想要访问的树的深度。两种walk方法都具有FileVisitOption...的可变长参数,但是你只能提供一种选项:FOLLOW_LINKS,即跟踪符号链接。
注意:如果要过滤walk返回的路径,并且你的过滤标准涉及与目录存储相关的文件属性,例如尺寸、创建时间和类型(文件、目录、符号链接),那么应该使用find方法来替代walk方法。可以用某个谓词函数来调用这个方法,该函数接受一个路径和一个BasicFileAttributes对象。这样做唯一的优势就是效率高。因为路径总是会被读入,所以这些属性很容易获取。
这段代码使用了Files.walk方法来将一个目录复制到另一个目录:
遗憾的是,你无法很容易地使用Files.walk方法来删除目录树,因为你需要在删除父目录之前必须先删除子目录。下一节将展示如何克服此问题。