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等等,当然你用这 ...
随机推荐
- cmd for install pygame in python 3.7
Higher version Python better and convinient to use! Down load pygame whl file: C:\Work\software>p ...
- Day01-初识 Python
1.CPU/内存/硬盘/操作系统 CPU :计算机的运算和处理中心,相当于人类的大脑. 内存 :暂时存储数据,临时加载数据应用程序. 硬盘 :长期存储数据. 操作系统:一个软件,连接计算机的硬件与所有 ...
- 用.NET解索尼相机ARW格式照片
用.NET解索尼相机ARW格式照片 目前常用的照片格式是.jpg,它只能提供8bit的色彩深度,而目前主流的相机都能提供高达12bit-14bit的色彩深度,动态范围和后期处理能力也大大增加,这也是为 ...
- 学习之Redis(一)
一.redis简介 一般学习,最好先去官网,之所以建议看官网,是因为这是一手的学习资料,其他资料都最多只能算二手,一手资料意味着最权威,准确性最高.https://redis.io/topics/in ...
- 智能家居CC2530功率放大组网RFX2401C和AT2401C的区别
两者最大的区别就是RFX2401C的增益为12dbmAT2401C的增益为14dbm这就会导致AT2401C的功耗会比RFX2401C大一点点,但距离也会相对更远,并且增加了EDS防静电等级,多出2个 ...
- textView的用法及技巧
转自:http://bbs.9ria.com/thread-244445-1-1.html 一.新建一个textView //初始化 UITextView *textView = [[[UITextV ...
- iOS动画浅汇
转自:http://www.cocoachina.com/ios/20160311/15660.html 在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳 ...
- 2019CCPC秦皇岛 K MUV LUV UNLIMITED(博弈)
MUV LUV UNLIMITED Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- Hadoop完全分布式集群搭建
Hadoop的运行模式 Hadoop一般有三种运行模式,分别是: 单机模式(Standalone Mode),默认情况下,Hadoop即处于该模式,使用本地文件系统,而不是分布式文件系统.,用于开发和 ...
- 大数据学习笔记——Hadoop编程实战之Mapreduce
Hadoop编程实战——Mapreduce基本功能实现 此篇博客承接上一篇总结的HDFS编程实战,将会详细地对mapreduce的各种数据分析功能进行一个整理,由于实际工作中并不会过多地涉及原理,因此 ...