文件扫描的核心算法

news/2024/11/29 16:31:38/

扫描本地文件,或者新插入一个U盘,怎么用一种比较合理算法去扫描整个盘符,获取到想要的文件呢?比如音乐、视频、图片文件等。大致的思路肯定是从根节点开始扫描,然后递归扫描整个文件,最后形成一个树形结构,文件就存在于这些树枝当中。
首先需要定义数据结构。
1、文件夹的数据结构:

FolderNode{
private String mPath; //绝对路径
private FolderNode parent; //父节点
private TreeMap<String,FolderNode> childs; //子节点
private List<FileNode> musics; //音乐相关文件集合 
private List<FileNode> videos; //视频相关文件集合
}

2、文件的数据结构:

FileNode{
private String mPath; //绝对路径
private FolderNode parent; //父节点
public String id3_album = "";//歌手(非必须)
public String id3_artist = "";//专辑(非必须)
public String id3_title = "";//歌名(非必须)
}

扫描文件是从根节点开始的,那么首先需要构建一个根节点

private FolderNode usbRoot = new FolderNode(USB_ROOT);

扫描一个盘符,是把每一级的扫描任务分解成一个个run,放到线程池中去并发执行。但在做这些之前,我们先要定义一个子线程来开启和管理后面递归扫描时出发的多线程。不然由于是多线程,就不知道各个线程的执行情况。

class ScanThread extends Thread{FolderNode folderNode;int mAddTaskNumber,mExuteTaskNumber;//定义一个增加线程的数量,一个执行完线程的数量public ScanThread(FolderNode folderNode){this.folderNode = folderNode;}@Overridepublic void run(){scan(folderNode,this);}	
}
san(final FolderNode pNode,final ScanThread scanThread){synchronized (scanThread.mLock){scanThread.mAddTaskNumber ++;}Runnable stubRunnable = new Runnable{@Overridepublic void run() {File file = new File(pNode.mPath);file.listFiles( new FileFilter(){@Overridepublic boolean accept(File file) {if(file.isDirectory()){//如果是文件夹,继续递归扫描FolderNode childNode = new FolderNode(file);childNode.parent = pNode;scan(childNode);}else{//如果是具体文件,则不用再递归FileNode mNode = new FileNode(file,pNode);switch(ScanUtil.getTypeByPath(mNode.getPath())){case MUSIC:pNode.addMusic(mNode);case VIDEO:pNode.addVideo(mNode);}}return false;});pNode.setScanFinish(true);synchronized(scanThread.mLock){scanThread.mExuteTaskNumber ++;if(scanThread.mAddTaskNumber == scanThread.mExuteTaskNumber){//根目录下的所有文件已经扫描完毕}}}};mThreadPoolExecutor.execute(stubRunnable);	
}

上面的FileFilter过滤器不是真的要过滤什么文件,而是用来列出每个文件,然后执行对此文件或者文件夹的执行逻辑。


http://www.ppmy.cn/news/666602.html

相关文章

用计算机如何扫描文件,打印机扫描文件到电脑方法教程

有时我们需要用打印机扫描文件到电脑上保存&#xff0c;但是很多用户都不知道怎么操作&#xff0c;我们扫描文件到计算机就需要这个程序的帮助。具体操作方法请参考下文中的步骤进行处理。 打印机扫描文件到电脑的方法&#xff1a; 1、首先把文件背面朝上&#xff0c;放到打印机…

文件扫描怎么弄?这三个简单方法试试看

曾经&#xff0c;有个名叫小林的年轻人&#xff0c;在一家大型公司工作。他的主要工作是对公司的文件进行整理和归档&#xff0c;确保文件能够很好地存储和检索。但有一天&#xff0c;小明发现自己手头上的文件已经堆积如山&#xff0c;时间久了&#xff0c;他开始感到力不从心…

怎么将文件进行扫描?不如试试这几种好用的扫描方法

现代社会已经迎来了数字化时代&#xff0c;纸质文件被电子文档所取代。但是&#xff0c;对于很多人来说&#xff0c;把纸质文件转换成电子文档仍然是个大挑战。这时候&#xff0c;扫描技术就成为了一个不可或缺的工具&#xff0c;可以把纸质文件快速地变成数字文件&#xff0c;…

劫持react组件

劫持props 假设我们有一个原组件&#xff0c;它接收一个 name prop&#xff0c;并显示一个问候语&#xff1a; // 原组件 function Greeting(props) {return <h1> Hello, {props.name}! </h1>; }我们可以定义一个高阶组件&#xff0c;它可以通过 props 传递一个 …

Windows最好使用的系统必备软件(包含下载)

&#xff08;下面按优劣排序&#xff09; 浏览器 Microsoft Edge&#xff08;新版&#xff09; 优点 内核是Chrome&#xff0c;设置和特色应用等又继承了Microsoft Edge&#xff08;旧版&#xff09;&#xff0c;InPrivate窗口可以对学校、单位或 Internet 服务提供商隐藏你…

msdn下载的系统怎么安装

​有小伙伴们不知道安装msdn系统的具体操作&#xff0c;那么小编就教大家下载的系统怎么安装吧。 工具/原料&#xff1a; 系统版本&#xff1a;win10 专业版 品牌型号&#xff1a;联想小新Air 13 Pro 软件版本&#xff1a;小鱼一键重装系统v3.1.329.319 方法/步骤&#xf…

面试题:两个线程,一个输出字母,一个输出数字,交替输出

方法一&#xff1a;synchronized 的 notify() 和 wait() 方法 notify()&#xff1a;随机唤醒线程中的任意一个&#xff1b; wait()&#xff1a;线程等待&#xff0c;当前线程进入等待队列&#xff1b; public class Test1 {private static Thread t1 new Thread();private …

React hooks文档笔记(二) 添加交互性

添加交互性 1. 事件传播1.1 停止传播1.2 阻止默认事件 2. [Hook] useState 状态3. 渲染和提交3.1 触发渲染3.2 React渲染组件3.3 提交对 DOM 的更改3.4 浏览器绘制 4. 渲染快照状态队列例子 5. 更新state中的对象 1. 事件传播 js的事件流&#xff1a; 事件捕获&#xff1a;从…