zoukankan      html  css  js  c++  java
  • Java NIO.2 使用Files类遍历文件夹

    在以前的Java版本中,如果要遍历某个文件夹下所有的子文件、子文件夹,需要我们自己写递归,很麻烦。

    在Java7以后,我们可以NIO.2中的Files工具类来遍历某个文件夹(会自动递归)。

    大致用法:

     1     Path path=Paths.get("D:\二次元");
     2         
     3         Files.walkFileTree(path,new FileVisitor<Path>(){
     4 
     5             //访问文件夹之前自动调用此方法
     6             @Override
     7             public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
     8                 return null;
     9             }
    10 
    11             //访问文件时自动调用此方法
    12             @Override
    13             public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    14                 return null;
    15             }
    16 
    17             //访问文件失败时自动调用此方法
    18             @Override
    19             public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
    20                 return null;
    21             }
    22 
    23             //访问文件夹之后自动调用此方法
    24             @Override
    25             public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
    26                 return null;
    27             }
    28         });



    Files.walkFileTree(Path  path, FileVisitor visitor);     

    静态方法。第一个参数指定要遍历的文件夹,第二个参数是FileVisitor对象,指定遍历时如何处理文件、文件夹。

    FileVisitor是一个接口,需要实现4个方法。当然我们可以使用适配器 SimpleFileVisitor 类,只重写我们需要的方法。

    4个方法的返回值类型均是FileVisitResult,FileVisitReset是一个枚举类。代表访问此文件/文件夹后的后续行为。可使用的值:

    • CONTINUE     继续访问(/遍历)
    • TERMINATE    停止访问(/遍历)
    • SKIP_SUBTREE    继续访问,但不访问此文件/文件夹的子目录树
    • SKIP_SIBLINGS     继续访问,但不访问此文件/文件夹的兄弟文件/文件夹。

    需要以  FileVisitResult.  的形式引用,示例:FileVisitResult.CONTINUE    

    示例:输出每个文件、文件夹的名称。

     1     Path path=Paths.get("D:\二次元");
     2 
     3         Files.walkFileTree(path,new FileVisitor<Path>(){
     4 
     5             //访问文件夹之前自动调用此方法
     6             @Override
     7             public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
     8                 System.out.println(dir.getFileName());
     9                 return FileVisitResult.CONTINUE;
    10             }
    11 
    12             //访问文件时自动调用此方法
    13             @Override
    14             public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    15                 System.out.println(file.getFileName());
    16                 return FileVisitResult.CONTINUE;
    17             }
    18 
    19             //访问文件失败时自动调用此方法
    20             @Override
    21             public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
    22                 return FileVisitResult.CONTINUE;
    23             }
    24 
    25             //访问文件夹之后自动调用此方法
    26             @Override
    27             public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
    28                 return FileVisitResult.CONTINUE;
    29             }
    30         });

    作为根的文件夹(上例中的“二次元”)也算作一个遍历的节点。

    PreVisitDirectory()、PostVisitDirectory()、VisitFile()这3个方法,不能返回null,如果返回null,编译时ok,但运行时往往会报错——空指针异常。IDEA下的代码自动完成,4个方法的默认实现都是return null,需要注意。

     Java的工具类的命名一般是在对应类后面加一个s。比如:

    Collection  Collections

    Array    Arrays

    File    Files

    FileSystem   FileSystems

     
  • 相关阅读:
    三大范式
    html 横线的代码
    CSS下拉 菜单3.27第一次
    JS页面三种打开方式及对话框
    函数整理
    3.22整理作业
    for循环,if 练习
    php测试题
    设计模式
    面向对象的三大特性
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/10945693.html
Copyright © 2011-2022 走看看