登陆 注册

JAVA递归思想实现全盘搜索文件系统之高速版

守望者 2020-03-24 280人围观 ,发现0个评论 java

       在上一篇文章中(JAVA递归思想实现全盘搜索文件系统之进阶版)我们借助递归思想和多线程提升了全盘搜索文件系统的速度,

但是通过测试,好像还是有点慢,有没有办法再快一点呢?通过短暂的探索,我发现是可以再快一点的,岂止快一点,简直快很多。


这一次在上一篇实例的基础上做出改进,主要在globleSearchFile() 函数上做出改进


解析:


这里依然遍历文件系统所有盘符,但不是像上次那样,直接开启线程执行搜索,而是遍历对盘符下的文件集:

   如果子文件是一个文件,则判断是否为目标搜索文件,

   如果子文件是一个文件夹,则开启线程进行该文件夹下的全局搜索


这里相比上次(进阶篇)的改进之处在于,文件集的纵向深度更深一级,

开启的线程数也多了n倍,搜索效率上也高了n倍

快则几十毫秒,慢则三四秒,经实测,有时候比win10系统搜的还快


下面只给出改进部分的函数代码,其余代码同这篇文章里一致(JAVA递归思想实现全盘搜索文件系统之进阶版),请灵活进行替换:


 public String Globlelist_files(String des_fileName) {
		  File[] roots = File.listRoots();
		  
		  for(File file:roots) {     // 遍历文件系统所有盘符
			  
			   File[]files = file.listFiles();   // 得到盘符下所有子文件(文件夹)
			   
			      for(File f:files) {            // 遍历子文件(文件夹)数组
			    	   if(f.isFile()&&f.getName().equals(des_fileName)) { // 如果是文件,判断是否为目标文件
			    		   find = true;
			    		   find_path = f.getAbsolutePath();
//			    		   find_file();
			    		   return f.getAbsolutePath();
			    		  }
			    	   else {     // 如果是文件夹,则开启一个函数对该文件夹下进行全局搜索
			    		   String dir_path = f.getAbsolutePath();
			    			
			  			 new Thread(new Runnable() {
			  				
			  				@Override
			  				public void run() {    // 判断处理搜索结果
			  					boolean find = list_files(dir_path, des_fileName);  
			  					   if(find) {find_file();}
			  					   else {not_findFile();}
			  				}
			  			}).start();
			    	   }
			      } // for
		  }
		  
		  synchronized (object) {
			  while(!over) {
				  try {
					object.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			  }
		}
		  
//		  System.out.println("find? "+find);
		 return find_path;
	 }


    转载请附上本文链接:https://tufeng.xyz/java/27.html,谢谢合作!

请发表您的评论
请关注微信公众号
微信二维码