Java用广度优先搜索快速搜索文件
背景
在开发的过程中,经常需要在文件系统里按某些条件搜索文件,比如音乐播放器扫描音乐,而搜索文件,大多人喜欢用递归的方式,而这也是最容易想到的方式。递归方式如果文件夹很深就容易造成栈溢出,而且不断的压栈退栈也会使搜索效率变低。我们常用的文件通常不会放在太深的文件夹,我们应该一层一层下去搜索,放在浅层目录先被搜索,如果实时显示结果,得到想要的结果即停止,用广度优先搜索的优势就更能体现出来了。
|--E:/
|--Music/
|--pop/
|--Jay/
|--Leehom Wang/
|--rock/
|--beyond/
|--QQ/
|--q.mp3
|--k.mp3
假设有以上的目录结构,E:/是要搜索的根目录,搜索的的内容是后缀为mp3的文件,名称加斜杠的表示文件夹,只有名称的表示文件。
1. 如果用递归,它会依次搜索Music->pop-> LeehomWang->rock->beyond->QQ然后才到我们mp3文件,假设Music这个目录很深,它会一直搜下去,而我们在浅层目录的MP3文件却要等到最后才搜到。
2. 如果用广度优先搜索,我们一下子就可以搜索到我们的MP3文件,而且不需要压栈和退栈,如果文件夹数很多明显可以加快搜索速度。
总之在文件搜索时用广度优先搜索优于深度优先搜索(递归)
代码
/**
* 广度优先搜索文件或文件夹
* @param path 要搜索的目录
* @param regex 搜索的通配符
* @param isDisplyDir 是否在搜索结果中显示文件夹
* @param isDisplayFile 是否在搜索结果中显示文件
*/
private static void bfsSearchFile(String path,String regex,boolean isDisplyDir,boolean isDisplayFile)
{
if(!(isDisplayFile||isDisplyDir))
{
throw new IllegalArgumentException("isDisplyDir和isDisplayFile中至少要有一个为true");
}
Queue<File> queue=new LinkedList<>();
File[] fs=new File(path).listFiles();
//遍历第一层
for(File f:fs)
{
//把第一层文件夹加入队列
if(f.isDirectory())
{
queue.offer(f);
}
else
{
if(f.getName().matches(regex)&&isDisplayFile)
{
System.out.println(f.getName());
}
}
}
//逐层搜索下去
while (!queue.isEmpty()) {
File fileTemp=queue.poll();//从队列头取一个元素
if(isDisplyDir)
{
if(fileTemp.getName().matches(regex))
{
System.out.println(fileTemp.getAbsolutePath());
}
}
File[] fileListTemp=fileTemp.listFiles();
if(fileListTemp==null)
continue;//遇到无法访问的文件夹跳过
for(File f:fileListTemp)
{
if(f.isDirectory())
{
queue.offer(f);////从队列尾插入一个元素
}
else
{
if(f.getName().matches(regex)&&isDisplayFile)
{
System.out.println(f.getName());
}
}
}
}
}
Java用广度优先搜索快速搜索文件的更多相关文章
- windows文件快速搜索软件推荐
everything文件搜索工具,可以快速搜索windows下的文件
- 在ZOHO企业网盘中如何快速搜索文件?
现在越来越多的企业采用企业网盘来存储文档和资料,而且现在市面上的企业网盘各种各样.在使用企业网盘过程中,很多用户会问到企业网盘中如何快速搜索文件的问题.但是无论是"标签"功能还是普 ...
- 快速搜索多个word、excel等文件中内容
背景:要在多个文件甚至文件夹中找到文件中包含的某些内容 以win10举例: 1.打开一个文件夹 2.打开文件夹选项 3.配置搜索 4.搜索文件
- Android 自定义支持快速搜索筛选的选择控件(一)
Android 自定义支持快速搜索筛选的选择控件 项目中遇到选择控件选项过多,需要快速查找匹配的情况. 做了简单的Demo,效果图如下: 源码地址:https://github.com/whieenz ...
- python 全栈开发,Day115(urlencode,批量操作,快速搜索,保留原搜索条件,自定义分页,拆分代码)
今日内容前戏 静态字段和字段 先来看下面一段代码 class Foo: x = 1 # 类变量.静态字段.静态属性 def __init__(self): y = 6 # 实例变量.字段.对象属性 # ...
- c# JD快速搜索工具,2015分析JD搜索报文,模拟请求搜索数据,快速定位宝贝排行位置。
分析JD搜索报文 搜索关键字 女装 第二页,分2次加载. rt=1&stop=1&click=&psort=&page=3http://search.jd.com/Se ...
- 【阿里云产品公测】大数据下精确快速搜索OpenSearch
[阿里云产品公测]大数据下精确快速搜索OpenSearch 作者:阿里云用户小柒2012 相信做过一两个项目的人都会遇到上级要求做一个类似百度或者谷歌的站内搜索功能.传统的sql查询只能使用like ...
- 对图片进行索引,存入数据库sqlite3中,实现快速搜索打开
对图片进行索引,存入数据库中,实现快速搜索打开 这个任务分为两步: 第一步:建立索引 import os import shutil import sqlite3 # 扫描函数,需扫描路径目录处 ...
- 如何用java实现一个p2p种子搜索(1)-概念
前言 说句大实话,网上介绍怎么用java实现p2p种子的搜索这种资料不是特别多,大部分都是python的,用python的话就会简单很多,它里面有很多简单方便的包,libtorrent等等,当然你用这 ...
随机推荐
- SpringBoot 整合mongoDB并自定义连接池
SpringBoot 整合mongoDB并自定义连接池 得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它 ...
- DJango模型Meta选项详解
Django模型之Meta选项详解 MEAT选项 Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.而可用的选项大致包含以下几类 abstract 这个属性是定义当 ...
- C语言博客作业11
一.本周教学内容&目标 第5章 函数 要求学生掌握各种类型函数的定义.调用和申明,熟悉变量的作用域.生存周期和存储类型. 二.本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求 ...
- MyBatis开发Dao的原始Dao开发和Mapper动态代理开发
目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...
- 小白探究UE4网络系列(一)、UE4网络基础类分析
转载请标明出处:http://www.cnblogs.com/zblade/ 一.概要 捣鼓UE4也有两个多月了,从这儿开始,逐步探究UE4中经典的值复制,RPC两种同步方式.想要弄到其复制和调用的原 ...
- ios 10 更新 新体验
1.使用手机登录开发者网站https://developer.apple.com/download/ 2.下载描述文件 3.安装描述文件,按照提示步骤操作 4.更新ios系统 下面的方法是连接电脑直接 ...
- Mac 配置 PlantUML
PlantUML简介 UML: Unified Modeling Language 统一建模语言,是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面 ...
- 《Dotnet9》系列-开源C# Winform控件库1《HZHControls》强力推荐
大家好,我是Dotnet9小编,一个从事dotnet开发8年+的程序员.我最近在写dotnet分享文章,希望能让更多人看到dotnet的发展,了解更多dotnet技术,帮助dotnet程序员应用dot ...
- F#周报2019年第50期
新闻 Azure Functions 3.0系统上线 GC性能架构--第1部分 ConfigureAwait问题解答 介绍System.Threading.Channels Windows Serve ...
- 捅娄子了,写个bug被国家信息安全漏洞共享平台抓到了?
摸不了鱼了 2019 年 11 月 26 日,本来应该是无比平静的一天,开开会,改改bug,摸摸鱼之后等着下班.刷着新闻的间隙,手机的消息提示音响了起来,收到了一条邮件,平时收到邮件我都会选择稍后处理 ...