大海捞针 - Everthing的实现思路

一、写在前面

有时候在Windows命令行下需要查询一些工具,但Windows命令行无法进行全局搜索,只能在当前文件下搜索。并且,for命令也需要写脚本进行搜索,很不方便。所以,我仿照Everthing桌面工具,自己DIY了一款基于Java语言的命令行工具,用来实现Windows命令行中的文件搜索。

二、意义

1.解决了Windows下搜索的盘符限制,实现在整个文件系统中的搜索。

2.可以跨平台使用(Windows、Linux)。

3.当然了,还锻炼了自己的编码能力~

三、功能分析

我主要实现了index索引功能和search检索功能,如下:

大海捞针 - Everthing的实现思路_第1张图片

四、功能模块

大海捞针 - Everthing的实现思路_第2张图片 Everthing的功能模块图

1.检索search

(1)文件名模糊检索:如:search java 检索文件名包含java的文件

(2)文件名+类型:如:search java doc 检索文件名包含java的文档类型文件

文件类型:img(图片类)、doc(文档类)、bin(二进制文件)、archive(归档类文件)、other(其他类型)

(3)清理删除文件:检索时清理掉已经在本地删除的文件

2.索引index

(1)默认索引

(2)用户自定义索引:用户自定义索引目录和排除索引的目录

(3)文件系统监听:当本地文件新增或删除时,数据库会有相应的修改

五、实现

开闭原则(对扩展开放,对修改关闭),高内聚低耦合

大海捞针 - Everthing的实现思路_第3张图片 Everthing的分层结构图

基本模型类model:

(1)检索类Condition:存放检索的条件

(2)文件类型:img、doc、bin、archive、other

(3)Thing类:索引File之后的信息(文件名、文件类型、文件路径、文件路径深度),存入数据库

 

1.持久化层

(1)设计数据库表

  • 创建数据库(my_everthing)
  • 设计数据库表(Thing类对象的属性)

(2)数据库编程JDBC - 工厂设计模式(单例工厂)

  • 创建数据源(DataSource) - 依赖Druid数据库连接池
  • 执行数据库脚本

大海捞针 - Everthing的实现思路_第4张图片

2.业务层

(1)检索

  • 数据库的初始化工作
  • 数据库的访问(使用DataSource)
  • 实现检索业务(查询)

(2)索引

  • 数据库的初始化工作
  • 数据库的访问(使用DataSource)
  • 实现索引业务(插入):遍历文件系统中的所有业务,对一些特定的文件或目录进行排除,然后将文件对象转换为Thing对象,调用数据库访问的插入操作(一次处理一个盘符)。

因为检索和索引类似,所以讲其中对数据库的操作提出来,放到dao中实现。

(3)文件系统监控

  • 文件(目录)的新增、删除
  • 监控操作系统的文件系统中文件的变化

采用开源库中提供的Apache Commons(遍历文件系统)- Filemonitor 文件监控

FileAlterationListener:用来接收文件系统的通知,需要自己实现的接口

FileAlterationObserver:发现文件变化,用来通知,依赖listener对象

FileAlterationMonitor:用来调度:启动、停止、给监听器添加通知者,依赖observer对象

对文件的一些处理操作:大海捞针 - Everthing的实现思路_第5张图片

3.控制层

统一调度器

  • 构建索引(index功能,业务FileScan)
  • 检索数据(search功能,业务FileSearch)

4.客户端

命令行客户端

  • 欢迎
  • 帮助
  • 退出
  • 索引
  • 检索

六、源码

GitHub地址:https://github.com/Ahiahiahia/project/tree/master/my-everthing

七、涉及技术

Java多线程

Java文件操作

Database(h2嵌入式数据库)

JDBC

Lombok库(配置jar包)

Apache Commons IO(文件系统监听)

八、开发环境

Windows、maven、IDEA

九、功能效果

1.命令行

2.help帮助命令

大海捞针 - Everthing的实现思路_第6张图片

3.index索引

search检索

4.文件监控

大海捞针 - Everthing的实现思路_第7张图片

十、发现与修改缺陷(已解决)

存在缺陷:

1.检索的结果数量限制,排序策略,应该给用户提供可配置的机会

2.索引的目录和文件以及排除的目录的文件,应该给用户提供可配置的机会

3.索引之后,文件被删除,但仍然可以被检索

解决办法:

1.针对1,2两点,增加一个参数处理的方法:通过执行程序的时候传入参数,使配置信息可变

2.针对3,增加一个清理删除文件的工作:检索时判断文件是否存在,不存在则删除

十一、项目测试

1.测试点整理

大海捞针 - Everthing的实现思路_第8张图片

2.划分等价类

  • 有效等价类

        1)在命令行输入quit:成功退出工具,测试成功。

        2)在命令行输入help:成功显示命令列表,测试成功。

        3)在命令行输入index:成功建立索引,测试成功。

        4)在命令行输入search java:成功检索到文件名包含java的文件,测试成功。

        5)在命令行输入search java doc:成功检索到文件名包含java的文档类型文件,测试成功。

        6)在命令行输入search java img:成功检索到文件名包含java的图片类型文件,测试成功。

        7)在命令行输入search java bin:成功检索到文件名包含java的二进制类型文件,测试成功。

        8)在命令行输入search java archive:成功检索到文件名包含java的归档类型文件,测试成功。

        9)在命令行输入search java other:成功检索到文件名包含java的不是以上几类的文件,测试成功。

  • 无效等价类

       1)检索内容不存在:没有任何输出,测试成功。

       2)检索exclude里的文件:没有任何输出,测试成功。

3.边界值分析法

       1)默认检索文件输出数量上限:30个

       2)默认检索文件输出下限:1个

4.容错性测试

      1)输入错误命令:没有任何输出,测试成功。

      2)输入错误命令格式:没有任何输出,测试成功。

      3)在index之前输入search:没有任何输出,测试成功。(需改正)

      4)数据库连接失败:报错,测试成功。

5.兼容性测试

该项目不能再没有安装jre的环境下运行。

十二、扩展思路

可视化界面

历史检索内容

 

 

 

 

 

 

 

 

你可能感兴趣的:(project)