Java学习笔记:使用File.walkFileTree遍历文件

这篇文章是对自己学习的一个总结,学习资料是Java1.8官方文档。这篇文章主要是讲如何使用walkFileTree方法,会涉及到部分源码,但是浅尝辄止,主要还是讲如何应用。


方法简介

1.7以前的Java想要遍历指定目录下的所有文件和子目录的话,就只能使用递归的方式。这种方式不仅复杂,灵活性也很差。

但现在不一样了,Files类提供了walkFileTree()方法来灵活遍历文件。walkFileTree()方法有下面两种重载形式。

  1. walkFileTree(Path start, FileVisitor<? super Path> visitor>:遍历start路径下的所有文件和子目录。
  2. walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor):和上一个方法功能类似,但是它最多遍历到maxDepth深度的文件。

这两个方法中,Path类比较简单,就是一个描述路径的类,这里不多讲。

这两个方法遍历文件的方式是深度遍历。

那么剩下的就是弄清楚FileVisitor,FileVisitOption这两个东西是什么鬼。


FileVisitor

点进文档查看这个类的描述(他不是类啊,是个接口)

大致翻译一下,它是文件访问器,它的实现类是walkFileTree()方法的参数。这描述等于啥也没说,我们就是想知道这接口可以干嘛。不过不用慌,接口就是规范,用来规范行为,那它作为文件访问器,那肯定是来规范访问文件时可以有什么操作。我们看看他的抽象方法。

只有这四个抽象方法。根据方法的描述,从上到下,这四个方法分别是定义

  1. 每当访问一个文件夹,访问结束后结束后干些什么?
  2. 每当访问一个文件夹,访问前干些什么?
  3. 每当访问一个文件,访问它时对它具体做什么?比如删除这个文件,复制等。
  4. 每当访问一个文件,如果这个文件是不可访问的话,要怎么办?

看到这里就应该大致对这个接口有了解了。它存在的意义就是我们实现它的抽象方法,在其中定义我们在访问文件时的各种操作。

上面的四个抽象方法有多出来FileVisitResult和BasicFileAttributes这两个陌生的类,这两个类比较简单。

首先是FileVisitResult。它是一个枚举类。我们在访问某一个文件时,有访问前,可以访问后,访问中,访问失败这四个节点的操作。完成这些节点的操作以后,我们可以让程序不再继续访问剩下的文件,或者不再访问平级的文件,去直接访问子目录等。我们就需要使用FileVisitResult的不同枚举值告诉程序接下来应该怎么做。下面是FileVisitResult的四个枚举值。

分别代表正常访问下个文件;

略过剩下的同级文件,直接访问子目录下的文件;

访问下一个同级文件,不再访问子目录;

立刻终止,停止访问文件

至于BasicFileAttributes类,它就是提供了很多方法来获得当前访问文件的各种属性,比如文件的大小,上次修改时间,是否是目录等。所有的方法如下所示,不一一介绍了。

现在我们回过去看,就能大致明白如何使用walkFileTree(Path start, FileVisitor<? super Path> visitor>)方法来遍历文件。这里我么来简单实践一下理解更深刻些。

我打算遍历一个文件和这个文件的所有子文件,并且打印出来。读者可自己试试打印效果。要注意,遍历方式是深度遍历,并且隐藏文件也可以遍历到。

Path path = Paths.get("/Users/user/Desktop/test");
FileVisitor<Path> fileVisitor = new FileVisitor<Path>() {
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        System.out.println("准备访问文件,准备访问的文件名是" + dir.getFileName() + " 文件大小为" + attrs.size());
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        System.out.println("正在访问文件,文件名为" + file.getFileName());
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
        return null;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
        System.out.println(dir.getFileName() + "已访问结束,准备访问下一个文件");
        return FileVisitResult.CONTINUE;
    }
};
Files.walkFileTree(path, fileVisitor);

为了简化FileVisitor繁杂的操作,Java还提供了一个简单实现了FileVisitor的类SimpleFileVisitor

SimpleFileVisitor没什么特别之处,它只是简单复写了FileVisitor的四个方法。下面是SimpleFileVisitor的部分代码截图

能看出来,SimpleFileVisitor就是判断一下参数是不是空,为空则抛出异常,不为空就继续遍历。


FileVisitOption

就是一个枚举类,而且只有一个枚举值······搞不懂是怎么用的······

猜你喜欢

转载自blog.csdn.net/sinat_38393872/article/details/103636011