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等等,当然你用这 ...
随机推荐
- Block-wise 2D kernel PCA/LDA for face recognition-笔记
In the present work, we propose a framework for kernel-based 2D feature extraction algorithms tailor ...
- 怎么把宿主机上的镜像推送到hub上
怎么把宿主机上的镜像推送到hub上: 1.查看系统中存在的镜像: [root@izuf63bjp8ts8nkl13pxh1z devicemapper]# docker imagesREPOSITOR ...
- vue实例化过程
我们在用vue进行开发项目时,是否存在疑惑,new Vue(xxx)的过程中,究竟发生了什么?定义的数据,是如何绑定到视图上的?本篇主要介绍在实例化vue时,主要做了哪些事,文章比较长,主要篇幅内容为 ...
- Android Activity生命周期及启动模式
曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记.后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看.或许保存成博客的形式,会是更好的选 ...
- 第三章 学习Shader所需的数学基础(3)
@[TOC] 1. 顶点的坐标空间变换过程 我们知道,在渲染流水线中,一个顶点要经过多个坐标空间的变换才能最终被画在屏幕上.一个顶点最开始是在模型空间中定义的,它最后会被变换到屏幕空间中,得到真正的屏 ...
- PyCharm 2019.3激活破解教程(永久)
2019.12.02 jetbrains公司发布了Python的最强编辑器PyCharm 2019.3版本.本次大版本主要对Jupyter notebooks .MongoDB.Python3.8功能 ...
- Web安全-之文件上传漏洞场景
1 上传漏洞危害介绍 上传是Web中最常见的功能,如果上传功能存在设计.编码缺陷,就容易形成上传漏洞,从而成为致命的安全问题,攻击者可以通过上传脚本木马,实现查看/篡改/删除源码和任意涂鸦网页,可 ...
- Python常用转义字符
\ 在行尾时是 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a 响铃 \b 退格 \e 转义 \000 空 \n 换行 \v 纵向制表符 \t ...
- Java中跳出多重嵌套循环的方法
一.使用标号 1.多重嵌套循环前定义一个标号 2.里层循环的代码中使用带有标号 break 的语句 public static void main(String[] args) { ok: for(i ...
- ARTS-S golang goroutines and channels(二)
向tcp服务端发消息 package main import ( "io" "log" "net" "os" ) fun ...