来点实用的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 终止遍历


下面,散仙给出测试目录的截图:


来点实用的Java NIO(二)_第1张图片



核心代码,如下:

	
	/**
	 * 继承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的方式,替代那种复杂的做法了。

你可能感兴趣的:(java,递归,nio,遍历文件夹)