JAVA递归思想实现全盘搜索文件系统之高速版
转载自:https://tufeng.xyz/java/27.html(来源于:兔峰博客)
在上一篇文章中(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;
}