主要是用Files的walkFileTree方法进行遍历,先看方法:
-
walkFileTree(Path start, FileVisitor<? super Path> visitor):遍历start路径下的所有文件和子目录。
-
walkFileTree(Path start,Set<FileVisitOption> options,int maxDepth,FileVisitor<? super Path> visitor):与上一个方法功能类似,该方法最多遍历maxDepth深度的文件。
上面两个方法都需要FileVisitor参数,它代表一个文件访问器,主要定义了如下四种方法:
-
FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs):访问子目录之前触发该方法。
-
FileVisitResult visitFile(T file, BasicFileAttributes attrs):访问file文件时触发该方法。
-
FileVisitResult visitFileFailed(T file, IOException exc):访问file文件失败时触发该方法。
-
FileVisitResult postVisitDirectory(T dir, IOException exc):访问子目录之火触发该方法。
上面定义的四个方法返回值类型FileVisitResult对象,是一个枚举类,代表访问之后的行为:
-
TERMINATE:代表“中止访问”的后续行为
-
SKIP_SIBLINGS:代表“继续访问”的后续行为,但是不访问该文件或者目录的兄弟文件或目录
-
SKIP_SUBTREE:代表“继续访问”的后续行为,但是不访问该文件或者目录的子目录
-
CONTINUE:代表“继续访问”的后续行为。
public class FileVisitorTest {
public static void main(String[] args) throws Exception{
//遍历/users/FileVDir目录
Files.walkFileTree(Paths.get(File.separator,"users","FileVDir"), new SimpleFileVisitor<Path>(){
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("正在访问 " + file + " 文件");
if (file.endsWith("FileVisitorTest.java")){
System.out.println("找到目标文件,查找结束!");
return FileVisitResult.TERMINATE; //终止访问
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("正在访问 " + dir + " 路径");
return FileVisitResult.CONTINUE;
}
});
}
}