Files类的walkFileTree方法


一、Files.walkFileTree() 遍历文件

walkFileTree()包含用于递归遍历目录树的方法,方法参数接收一个Path对象和一个FileVisitor对象,Path对象指向需要遍历的目录,FileVisitor在遍历的时候调用。FileVisitor接口定义如下:

public interface FileVisitor {

    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException;

    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException;

    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException;

    public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {

}

使用的时候需要实现FileVisitor的接口

try {
    Files.walkFileTree(start, new FileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            System.out.println("pre visit dir:" + dir);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            System.out.println("visit file:" + file);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {

            System.out.println("visit file failed:" + file);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {

            System.out.println("post visit dir:" + dir);
            return FileVisitResult.CONTINUE;
        }
    });
} catch (IOException e) {
    e.printStackTrace();
}

输出:

pre visit dir:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data
visit file:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data\nio-data-to.txt
visit file:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data\nio-data.txt
post visit dir:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data

FileVisitor接口中的方法会在不同的时间被调用:

  • preVisitDirectory():在访问任意目录前调用;
  • postVisitDirectory():在访问任意目录完成后调用;
  • visitFile():在访问到每个文件时调用;
  • visitFileFaild():在访问文件失败是调用

这四个方法都会返回一个FileVistResult枚举类型的实例,FileVistResult枚举包含四个选项:

  • CONTINUE:继续遍历;
  • TERMINATE:立即终止遍历;
  • SKIP_SIBLINGS:跳过当前目录下的兄弟文件继续遍历;
  • SKIP_SUBTREE:跳过当前目录继续遍历,这个只能在preVisitDirectory()方法中返回,在其他方法中返回和CONTINUE效果一样。

二、使用walkFileTree实现文件检索

private static void extracted4()  {
        Path start = Paths.get("D:/test");
        try {
            Files.walkFileTree(start, new SimpleFileVisitor<Path>(){
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    String filePath = file.toAbsolutePath().toString();
                    if(filePath.endsWith("test1.txt")){
                        System.out.println("file found at path:" + filePath);
                        return FileVisitResult.CONTINUE;
                    }
                    return super.visitFile(file, attrs);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述


三、使用walkFileTree递归删除目录

walkFileTree还可以用来递归删除目录及其目录中所有文件,Files.delete()只能删除空目录或者文件,当目中包含文件的时候无法直接删除,只能删除目录下所有文件后才能删除目录,walkFileTree可以在isitFile()方法中删除文件,然后在postVisitDirectory()删除目录实现递归删除目录

  Path start = Paths.get("D:/test/io");
        try {
            Files.walkFileTree(start, new SimpleFileVisitor<Path>(){
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    System.out.println("delete file:" + file);
                    Files.delete(file);
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                    System.out.println("delete dir:" + dir);
                    Files.delete(dir);
                    return FileVisitResult.CONTINUE;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中删除文件夹有以下两种方法: 1. 使用递归删除: 递归删除是一种常见的删除文件夹的方法,它的原理是先删除文件夹中的所有文件和子文件夹,然后再删除文件夹本身。这种方法需要注意的是,在递归过程中需要判断当前文件是否为文件夹,如果是文件夹则需要继续递归,直到删除所有文件和文件夹。 示例代码: ``` public static void deleteDirectory(File directory) { if(directory.exists()) { File[] files = directory.listFiles(); if(files != null) { for (File file : files) { if (file.isDirectory()) { deleteDirectory(file); } else { file.delete(); } } } directory.delete(); } } ``` 2. 使用Java 7的Files Java 7引入了Java.nio.file包,其中包含了Files,它提供了一些方便的方法来操作文件和文件夹。其中,Files的delete方法可以用于删除文件或文件夹,并且可以指定删除时是否递归删除。 示例代码: ``` public static void deleteDirectory(Path directory) throws IOException { Files.walkFileTree(directory, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { Files.delete(dir); return FileVisitResult.CONTINUE; } }); } ``` 需要注意的是,使用Files删除文件夹时需要捕获IOException异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值