欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java NIO.2 使用Files类遍历文件夹

程序员文章站 2022-04-14 18:48:19
在以前的Java版本中,如果要遍历某个文件夹下所有的子文件、子文件夹,需要我们自己写递归,很麻烦。 在Java7以后,我们可以NIO.2中的Files工具类来遍历某个文件夹(会自动递归)。 大致用法: Files.walkFileTree(Path path, FileVisitor visitor ......

 

在以前的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