来点实用的Java NIO(二)
程序员文章站
2022-05-17 10:06:01
...
现在如下一个简单的需求:要你用程序要遍历指定目录下的所有文件和子目录,你会怎么做?
估计大部分人,依旧使用的是老方式,采用递归的方式,来进行遍历,这种方式不仅复杂,而且灵活性也不高。那么现在我们就可以通过使用Java NIO里Files工具类来以更优雅,简单的方式来遍历文件和子文件。
下面,给出几个API方法,以供参考。
下面,散仙给出测试目录的截图:
核心代码,如下:
测试代码:
运行效果如下:
下面散仙,稍加改动来实现,查找到指定文件,便停止检索,改动代码如下:
运行效果如下:
当然,散仙上面的只是测试,随便写的,大家可以指定特定文件目录来,来检索测试,会了这个,我们就可以用Swing或者Java EE来模拟一个自己的Windows文件查找器了。
怎么样,是比早期Java的递归的方式,简单优雅的多吧,如果你还在使用递归的方式来查找目录树,那么现在你可以摒弃递归,来使用NIO的方式,替代那种复杂的做法了。
估计大部分人,依旧使用的是老方式,采用递归的方式,来进行遍历,这种方式不仅复杂,而且灵活性也不高。那么现在我们就可以通过使用Java NIO里Files工具类来以更优雅,简单的方式来遍历文件和子文件。
下面,给出几个API方法,以供参考。
类名 | 方法名 | 介绍 |
Files | walkFileTree(Path start,FileVisitor<? super Path> visitor) | 遍历start路径下的所有文件和子目录 |
Files | walkFileTree(Path start,Set<FileVisitOption> options,int maxDepth,FileVisitor<? super Path> visitor) | 与上方法类似,支持指定深度的遍历 |
SimpleFileVisitor | preVisitDirectory(T dir,BasicFileAttributes attrs) | 访问目录之前触发该方法 |
SimpleFileVisitor | postVisitDirectory(T dir, IOException exc) | 访问目录之后触发该方法 |
SimpleFileVisitor | visitFile(T file, BasicFileAttributes attrs) | 访问文件时触发该方法 |
SimpleFileVisitor | visitFileFailed(T file, IOException exc) | 访问失败时,触发该方法 |
FileVisitResult | CONTINUE | 继续访问 |
FileVisitResult | SKIP_SIBLINGS | 跳过当前文件 |
FileVisitResult | SKIP_SUBTREE | 不访问,该文件或该目录的子目录树 |
FileVisitResult | TERMINATE | 终止遍历 |
下面,散仙给出测试目录的截图:
核心代码,如下:
/** * 继承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的方式,替代那种复杂的做法了。