Java7使用FileVisitor遍历文件和目录
在以前的Java版本中,如果程序要遍历指定目录下的所有文件和子目录,则只能使用递归进行遍历,但这种方式不仅复杂,而且灵活性也不高。
Java7 提供了Files和Paths 两个工具类,其中Files包含了大量静态的工具方法来操作文件;Paths则包含了两个返回Path的静态工厂方法。
有了Files工具类的帮助,现在可以用更优雅的方式来遍历文件和子目录。Files类提供了如下两个方法来遍历文件和子目录。
//遍历start路径下的所有文件和子目录
public static Path walkFileTree(Path start, FileVisitor<? super Path> visitor)
//与上一个方法功能类似,该方法最多遍历maxDepth深度的文件
public static Path walkFileTree(Path start,
Set<FileVisitOption> options,
int maxDepth,
FileVisitor<? super Path> visitor)
上面两个方法都需要FileVisitor参数,FileVisitor代表一个文件访问器,walkFileTree()方法会自动遍历start路径下的所有文件和子目录,遍历文件和子目录都会“触发”FileVisitor中相应的方法。
FileVisitor中定义的4个方法
//访问子目录之前触发该方法
public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)
//访问文件时触发该方法
public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)
//访问文件失败时触发该方法
public FileVisitResult visitFileFailed(Object file, IOException exc)
//访问子目录之后触发该方法
public FileVisitResult postVisitDirectory(Object dir, IOException exc)
上面的4个方法都返回一个FileVisitResult,它是一个枚举类,代表访问之后的后续行为
CONTINUE:代表“继续访问”的后续行为
TERMINATE:代表“终止访问”的后续行为
SKIP_SUBTREE:代表“继续访问“,但不访问该目录文件或目录的子目录
SKIP_SIBLINGS:代表“继续访问”,但不访问该文件或目录的兄弟文件或目录
其实在实际使用中,没有必要实现FileVisitor中的4个方法,可以通过继承SimpleFileVisitor(FileVisitor的实现类),根据需要选择性的重写其中的方法。
使用FileVisitor遍历文件和子目录
@SuppressWarnings("unchecked")
public static void main(String[] args) {
try {
Files.walkFileTree(Paths.get("D:/GitHub/Git"), new SimpleFileVisitor(){
//访问子目录之前触发该方法
@Override
public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)
throws IOException {
System.out.println("正在访问: "+dir+" 路径");
return FileVisitResult.CONTINUE;
}
//访问文件时触发该方法
@Override
public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)
throws IOException {
System.out.println("正在访问: "+file+" 文件");
return FileVisitResult.CONTINUE;
}
//访问文件失败时触发该方法
@Override
public FileVisitResult visitFileFailed(Object file, IOException exc)
throws IOException {
System.out.println("访问 "+file+" 文件失败");
return FileVisitResult.CONTINUE;
}
//访问子目录之后触发该方法
@Override
public FileVisitResult postVisitDirectory(Object dir, IOException exc)
throws IOException {
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}