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

来点实用的Java NIO(二)

程序员文章站 2022-05-17 10:06:01
...
现在如下一个简单的需求:要你用程序要遍历指定目录下的所有文件和子目录,你会怎么做?
估计大部分人,依旧使用的是老方式,采用递归的方式,来进行遍历,这种方式不仅复杂,而且灵活性也不高。那么现在我们就可以通过使用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(二)
            
    
    博客分类: JAVA javanio遍历文件夹递归 



核心代码,如下:

	
	/**
	 * 继承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(二)
            
    
    博客分类: JAVA javanio遍历文件夹递归 
  • 大小: 48.7 KB