1. 前言

    简单记录一下Files.walkFileTree()的使用。

    在Android sdk版本大于 Build.VERSION_CODES.O中可以使用。

    正文

    Files.walkFileTree()中方法有两个

    # 第一个
    public static Path walkFileTree(Path start, FileVisitor<? super Path> visitor)
        throws IOException
    {
        return walkFileTree(start,
                            EnumSet.noneOf(FileVisitOption.class),
                            Integer.MAX_VALUE,
                            visitor);
    }
    # 第二个
    public static Path walkFileTree(Path start,
                                    Set<FileVisitOption> options,
                                    int maxDepth,
                                    FileVisitor<? super Path> visitor)
        throws IOException
    {
        //略
    }

    第一个也是调用第二个方法。

    walkFileTree

    这里就以第一个为例

    public static Path walkFileTree(Path start, FileVisitor<? super Path> visitor)
        throws IOException
    {
        return walkFileTree(start,
                            EnumSet.noneOf(FileVisitOption.class),
                            Integer.MAX_VALUE,
                            visitor);
    }

    需要传入两个参数:

    1. Path:文件起始路径

    2. FileVisitor:文件访问器,使用访问者模式

    FileVisitor

    FileVisitor是一个文件访问器,调用walkFileTree()方法后,会自动遍历start路径下的所有文件和子目录,遍历文件和子目录都会触发FileVisitor中相应的方法。

    FileVisitor方法
    public interface FileVisitor<T> {
        //访问目录前的操作
        FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
            throws IOException;
        //访问文件的操作
        FileVisitResult visitFile(T file, BasicFileAttributes attrs)
            throws IOException;
        //访问文件失败时的操作
        FileVisitResult visitFileFailed(T file, IOException exc)
            throws IOException;
        //访问目录后的操作
        FileVisitResult postVisitDirectory(T dir, IOException exc)
            throws IOException;
    }

    上面方法不一定都要重写,选择自己需要的即可。

    FileVisitResult

    返回FileVisitResult是⼀个枚举

    1. CONTINUE 代表继续访问的后续⾏为

    2. SKIP_SIBLINGS 代表继续访问的后续⾏为,但不访问该⽂件后⽬录的兄弟⽂件或⽬录

    3. SKIP_SUBTREE 代表继续访问的后续⾏为,但不访问该⽂件或⽬录的⼦⽬录树

    4. TERMINATE 代表终⽌访问的后续⾏为

    小试牛刀

    这里用了FileVisitor的实现类SimpleFileVisitor为例。

    demo 1

    隐藏内容!
    评论后才能查看!

    调用

    walkFileTree("/storage/emulated/0");

    日志打印

    walkFileTree preVisitDirectory path : /storage/emulated/0
    walkFileTree preVisitDirectory path : /storage/emulated/0/91es
    walkFileTree preVisitDirectory path : /storage/emulated/0/biumall.com
    walkFileTree visitFile file : /storage/emulated/0/biumall.com/91escom.txt
    walkFileTree visitFile file : /storage/emulated/0/biumall.com/biumall.com.txt

    上面访问目录和文件都是返回FileVisitResult.CONTINUE,所以会继续访问,直到访问结束

    demo 2

    隐藏内容!
    评论后才能查看!

    调用

    walkFileTree("/storage/emulated/0");

    日志打印

    walkFileTree preVisitDirectory path : /storage/emulated/0

    访问目录就返回终止,不管文件访问返回啥,都不会继续访问。

    其他的组合就懒得写了,有需要的自己去验证。

    参考文章

    1. 使用Files工具类中的walkFileTree(Path, FileVisitor)方法对文件进行操作

相关文章

1 条评论

  • 偶然
    偶然 游客

    不错,虽然流水文。
    我也偶尔写写,主要方便自己查阅。
    不错的习惯。

    广东深圳市
    回复