java 全盘搜索文件_java递归思想实现全盘搜索文件之高速版

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

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

5a6248719eab539b6cda4d7ca48f5a7b.png

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

解析:

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

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

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

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

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

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

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

a739ef1ba60c42f0cacc586144e75f71.png

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;

 }5a6248719eab539b6cda4d7ca48f5a7b.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前天正好要找一个本地文件, 就用java实现了, 全盘的本地文件搜索功能. 代码不依赖其它第三方jar, 连日志都用system.out了. 初学者可以了解下. 主程序: LocalFileSearcher.java LocalFileSearcher searcher = new LocalFileSearcher(); searcher.doSearch("迅雷"); log如下: Start search keyword: 迅雷 Start search all drivers! success: E:\迅雷下载 success: F:\迅雷下载 success: C:\Users\Administrator\Desktop\迅雷.lnk success: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\迅雷软件 success: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷 success: C:\Users\All Users\Microsoft\Windows\Start Menu\Programs\迅雷软件 success: C:\Users\Administrator\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\迅雷.lnk success: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Libraries\迅雷下载.library-ms success: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷\迅雷影音.lnk success: C:\Users\All Users\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷 success: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\迅雷软件 success: C:\Users\All Users\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷\迅雷影音.lnk success: C:\Users\Administrator\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\StartMenu\迅雷.lnk success: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷 success: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷\卸载迅雷.lnk success: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷\迅雷.lnk Search costs : 3861(ms) File searched : 154848 Folder searched: 31463 Success match : 16 后续再更新完善
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值