现在如下一个简单的需求:要你用程序要遍历指定目录下的所有文件和子目录,你会怎么做?
估计大部分人,依旧使用的是老方式,采用递归的方式,来进行遍历,这种方式不仅复杂,而且灵活性也不高。那么现在我们就可以通过使用Java NIO里Files工具类来以更优雅,简单的方式来遍历文件和子文件。
下面,给出几个API方法,以供参考。
类名方法名介绍FileswalkFileTree(Path start,FileVisitor<? super Path> visitor)遍历start路径下的所有文件和子目录FileswalkFileTree(Path start,Set<FileVisitOption> options,int maxDepth,FileVisitor<? super Path> visitor)与上方法类似,支持指定深度的遍历SimpleFileVisitor preVisitDirectory(T dir,BasicFileAttributes attrs)访问目录之前触发该方法SimpleFileVisitorpostVisitDirectory(T dir, IOException exc)访问目录之后触发该方法SimpleFileVisitorvisitFile(T file, BasicFileAttributes attrs)访问文件时触发该方法SimpleFileVisitorvisitFileFailed(T file, IOException exc)访问失败时,触发该方法FileVisitResultCONTINUE继续访问FileVisitResultSKIP_SIBLINGS跳过当前文件FileVisitResultSKIP_SUBTREE不访问,该文件或该目录的子目录树FileVisitResultTERMINATE终止遍历
下面,散仙给出测试目录的截图:
核心代码,如下:
class="java" name="code">
/**
* 继承SimpleFileVisitor类实现
* **/
public static class MyFile<Path> extends SimpleFileVisitor<Path>{
/**
* 访问该文件时,触发的方法
* */
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
//打印文件名
System.out.println("文件: "+file);
// if(file.toString().endsWith("docx")){
//
// System.out.println("找到文件,停止检索!");
// return FileVisitResult.TERMINATE;
// }
return FileVisitResult.CONTINUE;
};
/**
* 访问此目录前,触发的方法
*
* **/
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
System.out.println("目录: "+dir);
return FileVisitResult.CONTINUE;
};
}
测试代码:
public static void showAllFile(){
try{
Files.walkFileTree(Paths.get("E:", "秦东亮2013技术存档","HTML5"),new MyFile<>() );
}catch(Exception e){
e.printStackTrace();
}
}
运行效果如下:
目录: E:\秦东亮2013技术存档\HTML5
目录: E:\秦东亮2013技术存档\HTML5\1
目录: E:\秦东亮2013技术存档\HTML5\1\2
文件: E:\秦东亮2013技术存档\HTML5\1\2\新建 Microsoft Word 文档.docx
目录: E:\秦东亮2013技术存档\HTML5\3
文件: E:\秦东亮2013技术存档\HTML5\html5参考手册.chm
文件: E:\秦东亮2013技术存档\HTML5\《HTML+5+从入门到精通》-中文学习教程.pdf
下面散仙,稍加改动来实现,查找到指定文件,便停止检索,改动代码如下:
/**
* 访问该文件时,触发的方法
* */
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
//打印文件名
System.out.println("文件: "+file);
if(file.toString().endsWith("docx")){
System.out.println("找到文件,停止检索!");
return FileVisitResult.TERMINATE;
}
return FileVisitResult.CONTINUE;
};
运行效果如下:
目录: E:\秦东亮2013技术存档\HTML5
目录: E:\秦东亮2013技术存档\HTML5\1
目录: E:\秦东亮2013技术存档\HTML5\1\2
文件: E:\秦东亮2013技术存档\HTML5\1\2\新建 Microsoft Word 文档.docx
找到文件,停止检索!
当然,散仙上面的只是测试,随便写的,大家可以指定特定文件目录来,来检索测试,会了这个,我们就可以用Swing或者Java EE来模拟一个自己的Windows文件查找器了。
怎么样,是比早期Java的递归的方式,简单优雅的多吧,如果你还在使用递归的方式来查找目录树,那么现在你可以摒弃递归,来使用NIO的方式,替代那种复杂的做法了。
- 大小: 48.7 KB