千百度站群:千百度项目详解

目录

一. 简介

二. 背景

三. 意义

四. 功能

五. 涉及技术

六. 实现思路

七. 项目详解

八. 项目源码

九. 实现效果

十. 项目测试



一. 简介

基于Java语言编写的可以在命令行进行文件搜索并且可以跨平台的小工具。

 

二. 背景

有时候会需要在命令行下进行文件的搜索,但是Windows命令行的文件搜索命令find比较麻烦, 所以就想自己开发一款可以实现跨平台,而且效率比较高,进行搜索时也比较方便的小工具。

find命令格式:find /r 目录名 %变量名 in (匹配模式1,匹配模式2) do 命令

 

三. 意义

  • 解决Windows命令行下文件搜索繁琐的问题
  • 可以在Windows和Linux平台下无差异的使用
  • 锻炼自己的编码能力

 

四. 功能

1.检索文件信息

文件名模糊检索:如:search java 检索的是包含java字样文件

文件名模糊检索 + 文档类型:如:search java doc 检索的是包含java字样的文档类型的文件

2.索引文件信息

文件系统监听:本地文件进行新增或者删除的时候,数据库会有相应的更新

全量索引 + 自定义目录:用户可自定义检索的目录和不进行检索的目录

3.查看历史命令

历史命令模糊查找:如:history 可以显示出所有的历史命令

历史命令精确查找:如:history 5 可以显示出最近的五条命令

 

五. 涉及技术

  • Java
  • Database(嵌入式H2数据库)
  • JDBC
  • 多线程
  • Lombok库
  • 文件系统监控(Apache Commons IO)

 

六. 实现思路

1. 如何整理文件类型?

文件类型有很多种,我们不可能给每一种都划分为一类,所以就需要自己制定一个规则,来划分不同的文件类型。可以使用枚举。

2. 把文件存放在哪里?

可以把文件存放在数据库中,这样插入,查找,删除都会很方便,直接使用JDBC就可以了。如果再加上索引,还会提高查找的效率。

3. 用什么数据库比较合适呢?

一般常用的数据库是MySQL,但是考虑到代码要与数据库进行连接,有一系列的操作,所以我这次选择H2数据库。H2数据库的优点如下:

4. 怎样存放文件?

把文件的路径直接存放进去肯定是不可以的,我们可以把文件路径解析一下,把它分为文件名、文件的路径、文件路径的深度(输出文件的时候可以根据深度排序输出)、文件的类型。将文件的这些信息存入数据库中,要使用的时候直接用JDBC进行就可以了。

5. 怎样设置检索的条件?

保证可以进行模糊检索,所以检索的条件中一定要有name,name可以不完整,其他的还有文件类型,输出文件的个数以及输出文件深度的排序,都是可有可无的。

6. 如果文件发生变化,例如删除,创建,重命名等,应该采用怎样的方式进行检测?

进行文件系统的检测有两种方法:

  • JDK提供的文件系统监控:FileSystem中的WatchService类
  • Apache Commons io 开源库

但是使用WatchService类有一个缺点,就是它只能监听一级目录,不能监听更深层次的目录,比如它监听D:\test,只有test变化才通知,如果test\a发生变化不会通知。所以我们选用Apache Commons io开源库。

在Apache Commons io开源库中主要使用三个类:

FileAlterationListener:监听器,实现文件改变时触发的行为。它是一个接口,继承这个接口,自己实现改变时触发的行为。

FileAlterationObserver:观察者,观察文件的改变,通知注册的监听器执行的相应时间。它是一个final类,实现了Serializable接口。

FileAlterationMonitor:提供各种监听时候的文件处理。实现了Runnable接口,通过线程,每隔一段时间调用一次注册的观察者检查文件。

7. 除了上述问题,还有什么要考虑的吗?

  • 如果进行模糊搜索的时候,搜索一个比较常见的单词,例如java,本地有上百个这样的文件,要一次性全部输出吗?一次性全部输出很明显是不可取的,所以我们在编写代码的时候就要设置输出的最大数量,以此类推,为了效率更高,还可以设置不查找的目录,例如C盘中的ProgramData,就是没有必要进行查找的,可以直接不放入数据库中。再思考一下,为了用户友好,可以让用户自己设置参数。
  • 在文件删除后,不能放在那里占用内存,所以还需要一个进行文件清理的方法,在每次删除文件之后,把文件清理掉。
  • 一般命令行都有history命令,我们在这里也可以加上history命令,方便用户查找历史命令。

 

七. 项目详解

mini_enerything功能实现分层结构图:

基本模型:

(1)文件类型FileType:IMG、DOC、BIN、ARCHIVE、OTHER

(2)Thing类:索引File之后的属性信息。(name,path,depth,fileType)

(3)Condition类:检索的条件。(name,fileType,Limit,orderByAsc)

 

持久化层

(1)设计数据库的表

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

(2)数据库编程

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

 

业务层

(1)检索

  • 初始化数据库
  • 访问数据库
  • 进行检索(查询)

(2)索引

  • 初始化数据库
  • 访问数据库
  • 进行索引(插入)

上述两个过程非常类似,可以将对数据库的操作提取出来实现。

(3)文件系统监控

  • 文件或者目录的新增和删除
  • 监控文件系统中文件的变化

 

控制层

统一调度器

  • 构建索引(index功能)
  • 检索数据(search功能)

 

客户端

(1)欢迎

(2)帮助

(3)退出

(4)索引

(5)检索

(6)历史命令查询

 

八. 项目源码

https://github.com/menqiqi/mini_everything

 

九. 实现效果

命令行

帮助

索引

检索

历史命令查询

退出

 

十. 项目测试

  • 机器信息

处理器:Intel(R) Core(TM) i7-3520M CPU @2.90GHz 2.90GHz

内存:4.00G

磁盘:SSD

  • 软件信息

H2嵌入式文件存储,版本1.4.197

  • 测试数据

文件系统文件数:379752

  • 功能测试

等价类测试法:

a. 有效等价类

1)输入help,输出命令格式列表。

2)输入index,无输出内容。

3)输入search java,输出含有java的文件。

4)输入search java img,输出含有java的图片。

5)输入search java doc,输出含有java的文档。

6)输入search java bin,输出含有java的二进制文件。

7)输入search java archive,输出含有java的存档类型文件。

8)输入search java other,输出其他类型文件。

9)输入history,输出所有历史命令。

10)输入history 5,输出最近的5条历史命令。

11)输入history 10,10大于历史命令的个数,输出所有历史命令。

b. 无效等价类

1)检索内容不存在,无输出。

2)检索内容包含在exclude目录下,无输出。

3)输入命令错误,输出命令格式列表。

4)输入history -1,输出命令格式列表。

5)未建立索引就查询,无输出。

边界值测试方法:

a. 输出文件上限为25。

b. 输出文件下限为0。

c. 历史命令查询次数无上限。

  • 兼容性测试

在Windows平台和Linux平台运行,均成功。

 

相关推荐

相关文章