在以前的JAVA版本中,如果程序要遍历指定目录下的所有文件和目录,必须使用递归来实现。在新版本中有了Files工具类的帮助就可以很容易的实现目录的遍历。Files提供如下两个方法来遍历文件和子目录。
- walkFileTree(Path start, File Visitor<? super Path> visitor)
- wakkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor):与上个方法相比,该方法最多遍历maxDepth层。
这个方法需要一个Path和一个FileVisitor参数。其中Path是要遍历的路径,而FileVisitor则可以看成的一个文件访问器,它主要提供的四个方法,如下所示。
- FileVisitResult postVisitDirectiory(T dir, IOException exc):访问目录之后触发该方法
- FileVisitResult preVisitDirectiory(T dir, BasicFileAttributes attrs):访问子目录之前触发该方法
- FileVisitResult visitFile(T dir,BasicFileAttributes attrs):访问file文件时触发该方法
- FileVisitResult visitFileFailed(T dir, IOException exc):访问file文件失败时触发该方法。
这四个方法返回的都是FileVisitResult对象,它是一个枚举类,代表的是返回之后的一些后续的操作。
FileVisitResult主要包含四个常见的操作。
- FileVisitResult.CONTINUE 继续遍历
- FileVisitResult.TERMINATE 中止访问
- FileVisitResult.SKIP_SIBLINGS 不访问同级的文件或目录
- FileVisitResult.SKIP_SUBTREE 不访问子目录
示例如下:
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
public class FileVisitorTest
{
public static void main(String[] args)
throws Exception
{
// 遍历C:\Users\Administrator\Desktop\CASC申请
Files.walkFileTree(Paths.get("c:", "Users" , "Administrator" , "Desktop", "CASC申请")
, new SimpleFileVisitor<Path>()
{
// 访问文件时候触发该方法
@Override
public FileVisitResult visitFile(Path file
, BasicFileAttributes attrs) throws IOException
{
System.out.println("正在访问" + file + "文件");
// 找到了FileInputStreamTest.java文件
if (file.endsWith("附件1.“CASC奖学金”申请表.doc"))
{
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;
}
});
}
}
结果如下:
上面程序遍历遍历C:\Users\Administrator\Desktop\CASC申请 目录下所有文件和子目录,如果找到的文件已“附件1.“CASC奖学金”申请表.doc”结尾,则停止遍历。