Java Files.walkFileTree 文件遍历

参数1:路径  参数2:FileVisitor对象

walkFileTree(Path start, FileVisitor<? super Path> visitor)

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;

preVisitDirectory:访问目录时触发

visitFile:文件被访问时触发

visitFileFailed:访问文件发生错误时触发

postVisitDirectory:离开目录时触发

 上面方法返回都是FileVisitResult类,他是一个枚举类:

public enum FileVisitResult {
    /**
     *继续访问
     */
    CONTINUE,
    /**
     * 停止访问
     */
    TERMINATE,
    /**
     * 继续访问,但是不访问该文件或者目录的子目录
     */
    SKIP_SUBTREE,
    /**
     * 返回上一层目录继续访问,停止访问相邻目录或文件
     */
    SKIP_SIBLINGS;
}

使用的时候我们可以直接使用SimpleFileVisitor 他是FileVisitor的接口实现类

案例1:查看当前目录文件与文件夹的数量

public static void main(String[] args) throws IOException {
        AtomicInteger dirCount = new AtomicInteger();
        AtomicInteger fileCount = new AtomicInteger();
        Files.walkFileTree(Paths.get("D:\\jdk"), new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                System.out.println("----->" + dir);
                dirCount.incrementAndGet();
                return CONTINUE;
            }
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                System.out.println("-------->" + file);
                fileCount.incrementAndGet();
                return CONTINUE;
            }
        });
        System.out.println("文件夹数量:" + dirCount.get());
        System.out.println("文件数量:" + fileCount.get());
    }

注意:此方法便利的文件夹数量会比我们右键文件属性看到的文件夹数量多一,因为文件属性里是不包含当前文件夹的

 案例 2:删除当前目录以及子目录和文件

删除我们可以使用Files下的delete方法 但是如果当前目录下有子目录或者文件是不允许删除的

所有需要walkFileTree来进行遍历

注意:删除就没了

Files.walkFileTree(Paths.get("D:\\jdk - 副本"), new SimpleFileVisitor<Path>() {
          
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Files.delete(file);
                return CONTINUE;
            }
            
            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { 
                Files.delete(dir);
                return CONTINUE;
            }
        });

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值