天天看点

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.5.6 访问目录中的项

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

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

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.5.6 访问目录中的项

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

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.5.6 访问目录中的项

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

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.5.6 访问目录中的项

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

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

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

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.5.6 访问目录中的项

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