目录
1.项目名称:
我的搜索神器
2.项目简介:
仿照Windows桌面版的everything工具,用Java语言实现一个开发的命令行文件搜索工具.
3.项目背景:
想起自己刚开始买到笔记本电脑的时候,写完的文档就直接保存,之后想要再找到看一下,就不知道在哪打开,来上网搜了一下在Windows命令行下搜索文件可以使用 “for”命令,可是Windows命令行下搜索文件不能跨盘符搜索,于是就下载一个Everything工具,它能够基于文件名快速定位文件和文件夹位置,所以就想实现一个命令行式的可以跨盘符的文件搜索工具。
4.项目功能:
(1)检索文件信息
文件名模糊存储
文件名模糊索引(后模糊)+文档类型
(2)索引文件信息
文件系统监听
5.使用的技术
Java
文件操作
单例模式
I/O操作
Java多线程
JDBC编程
Apache Commons IO库
文件系统监控
插件Lombok
6.实现
从上到下分层:
客户端:实现命令行交互【通过控制台交互式输入】
控制层:同一管理调度
业务层:检索文件信息【search检索模块】、索引文件信息【index索引模块】
持久化层:将数据库永久性存储【MySQL数据库存储】
7.具体实现思路:
1.在实现具体业务之前,首先要将准备工作做好,首先将本项目中要用到的依赖文件和第三方库配置好,如下图
<dependencies> <!--数据库相关的依赖--> <!--暂时使用MySQL,JDBC编程屏蔽了数据库的差异,--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--<dependency>--> <!--<groupId>com.h2database</groupId>--> <!--<artifactId>h2</artifactId>--> <!--<version>1.4.197</version>--> <!--</dependency>--> <!--由阿里巴巴开源的数据库连接池druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.13</version> </dependency> <!--加入Lombook依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.6</version> </dependency> </dependencies> <!--程序构建信息[即编译插件、打包插件、依赖插件]--> <build> <!--构建信息 maven的功能都是通过插件完成的 1.plugin->多个goals 2.执行goal->绑定生命周期的某个阶段 3.通过插件的官网了解插件的使用 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <!--配置主清单文件--> <configuration> <archive> <manifest> <!--如果程序依赖了Jar包,也要将jar包加到Classpath--> <addClasspath>true</addClasspath> <mainClass>com.yt.retrievalartifact.cmd.CommandApplication</mainClass> <classpathPrefix>lib</classpathPrefix> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <version>3.1.1</version> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-lib</id> <goals> <goal>copy-dependencies</goal> </goals> <phase>package</phase> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build>
阿里开源的数据库功能比较全。
2.建立数据库,创建thing表用来存放文件(文件名,文件路径,文件路径深度,文件类型)
3.客户端:通过使用【help】、【quit】、【index】、【search】命令来进行文件操作。
创建config包:用来存放程序相关配置的程序代码:
(1)EverythingConfig:该类用来存放文件索引时的代码:
包括文件索引的目录,索引返回的最大文件数量,索引结果的顺序排列规则(默认是降序排列)
(2)HandlerPath:这里存放的是要索引的目录,因为在Windows系统下C盘中的好多文件都是系统文件,所以在索引时,就可以不对这些目录进行索引例如:C盘下的Program Files ,ProgramFiles(X86),ProgramData,如果是Linux系统下则“/root”,“/tmp”是不需要索引的目录
创建core包:该包用来存放核心业务逻辑处理相关的程序代码
创建model包:这里存放的是检索,索引,数据库操作时用到的模版信息
Condition类:该类是检索条件的模型类:文件名,文件类型,限制的数量,排列顺序
Things:数据库操作对象,包含的属性有:文件名称,文件路径,文件路径深度,文件类型
FileType类:存放可能的文件类型以及查找文件时的方式(包括按文件名查找和按照扩展名查找文件两种方式)
Dao层:数据库相关操作:
DataSourceFactory:获取数据源以及数据库相关的配置,表的初始化操作
创建 FileIndexDao:因为将本地文件索引到数据库中相当于表的插入操作,而索引完成之后,要检查是不是真的将文件索引到数据库中,所以就要查询一下,该部分主要是放的是文件索引(即数据表的插入操作,这里实在文件名上建立索引并以文件名的后模糊匹配来将文件索引到数据库中)和索引结果校验(表的查询操作)
Index包:该包主要存放文件扫描的代码
FileScanner:在扫描时添加文件拦截器(处理指定文件),拦截每个文件对象,先判断是否为要排除的目录,如果是就返回,否则就判断该文件是不是一个目录,如果是一个目录就递归索引一下。
Search包:存放文件检索的代码
ThingSearch:在检索的时候先判断要检索的文件是否存在,如果本地文件系统将文件删除,数据库中仍然存储到索引信息,那么要将其删掉
EverthingConfig:
该类是核心的同一调度器:将索引模块,检索模块,拦截器模块组合调度