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
上一篇: Netty服务端的启动源码分析
下一篇: JAVA基础之Set接口