在以前的Java 版本中,如果程序要遍历指定目录下的所有文件和子目录,则只能使用递归进行遍
历,但这种方式不仅复杂,而且灵活性也不高。有了Files工具类的帮助,现在可以用更优雅的方式来遍历文件和子目录。Files 类提供了如下两个方法来遍历文件和子目录。
walkFileTree(Path start, FileVisitor super Path> visitor):遍历start路径下的所有文件和子目录。
walkFileTree(Path start, Setoptions, int maxDepth,FileVisitor super Path>visitor):与上一个方法的功能类似。该方法最多遍历maxDepth深度的文件。
上面两个方法都需要FileVisitor 参数,FileVisitor 代表一个文件访问器,walkFileTree()方法会 自动遍历start 路径下的所有文件和子目录,遍历文件和子目录都会“触发”FileVisitor 中相应的方法。
FileVisitor中定义了如下4个方法。
➢FileVisitResult postVisitDirectory(T dir, IOException exc);访问子目录之后触发该方法。
➢FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs):访问子目录之前触发该方法。
➢FileVisitResult visitFile(T file, BasicFilettributes attrs);访问file 文件时触发该方法。
➢FileVisitResult visitFileFailed(T file, lOException exc):访问file文件失败时发该方法。
上面4个方法都返回一个FileVisitResult 对象,它是一个枚举类,代表了访问之后的后续为。
FileVisitResult定义了如下几种后续行为。
➢CONTINUE:代表“继续访问”的后续行为。
➢SKIP_SIBLINGS: 代表“继续访问”的后续行为,但不访问该文件或目录的兄弟文件或目录。
➢SKIP_SUBTREE:代表“继续访问”的后续行为,但不访问该文件或目录的子目录树。
➢TERMINATE: 代表“中止访问”的后续行为。
实际编程时没必要为FileVisitor 的4个方法都提供实现,可以通过继承SimpleFileVisitor( FileVisitor的实现类)来实现自己的“文件访问器”,这样就根据需要、选择性地重写指定方法了。
如下程序示范了使用FileVisitor 来遍历文件和子目录。
importjava.io.IOException;
importjava.nio.file.*;
importjava.nio.file.attribute.BasicFileAttributes;
publicclasstest{
publicstaticvoidmain(String[]args)throwsException{
//遍历g: \publishlcodes\15目录下的所有文件和子目录
Files.walkFileTree(Paths.get("g:","publish","codes","15"),
newSimpleFileVisitor(){//访问文件时触发该方法
@Override
publicFileVisitResultvisitFile(Pathfile
,BasicFileAttributesattrs)throwsIOException{
System.out.println("正在访问"+file+"文件");
//找到了FileVisitorTest.java文件
if(file.endsWith("FilevisitorTest. java")){
System.out.println("--已经找到目标文件--");
returnFileVisitResult.TERMINATE;
}
returnFileVisitResult.CONTINUE;
}
//开始访问目录时触发该方法
@Override
publicFileVisitResultpreVisitDirectory(Pathdir
,BasicFileAttributesattrs)throwsIOException{
System.out.println("正在访问:”+ dir+”路径");
returnFileVisitResult.CONTINUE;
}
});
}
}
上面程序中使用了Files工具类的walkFileTree()方法来遍历g:publish\codes\15目录下的所有文件和子目录,如果找到的文件以“FileVisitorTestjava”结尾,则程序停止遍历一这 就实现了对指定目录进行搜索,直到找到指定文件为止。