来点实用的Java NIO(二)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 来点实用的Java NIO(二)

来点实用的Java NIO(二)

 2013/11/25 21:26:01  qindongliang1922  程序员俱乐部  我要评论(0)
  • 摘要:现在如下一个简单的需求:要你用程序要遍历指定目录下的所有文件和子目录,你会怎么做?估计大部分人,依旧使用的是老方式,采用递归的方式,来进行遍历,这种方式不仅复杂,而且灵活性也不高。那么现在我们就可以通过使用JavaNIO里Files工具类来以更优雅,简单的方式来遍历文件和子文件。下面,给出几个API方法,以供参考。类名方法名介绍FileswalkFileTree(Pathstart,FileVisitor<?superPath>visitor
  • 标签:Java 实用
现在如下一个简单的需求:要你用程序要遍历指定目录下的所有文件和子目录,你会怎么做?
估计大部分人,依旧使用的是老方式,采用递归的方式,来进行遍历,这种方式不仅复杂,而且灵活性也不高。那么现在我们就可以通过使用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
  • 查看图片附件
发表评论
用户名: 匿名