1. 简介
基于Java语言开发的轻量级命令行文件搜索工具,占用极低的系统资源,得到超高的搜索效率。
2. 背景
有时候忘了文件的存储位置,但Windows系统自带的搜索执行起来太慢了,所以开发一款命令行工具,用来实现快速搜索文件的功能。
3. 功能
功能就是搜索文件所在路径。支持两种方式的搜索,一种是根据文件名获取文件路径,另一种是根据文件名+文件类型获取文件路径。结果显示可以自定义(比如对返回结果的数量限制;按照文件目录级数升序或降序排列;支持对搜索路径进行自定义,可以自己选择在搜索时排除掉哪些路径,比如C盘中的Windows目录下一般存放系统文件,我们在搜索时就可以排除这个目录;并且具有文件监控功能,当系统中有创建新的文件或删除文件时,会在命令行提示我们)。
4. 技术
- Java(文件操作,输入输出流)
- Database
- JDBC
- Java多线程
- 文件系统监控(Apache Commons IO)
5. 实现
实现部分,我们总体可以分为以下三部分
- 程序入口
这部分比较简单 ,我们只需要根据用户输入的命令,调用统一配置管理中相应的方法,给用户返回相应的结果即可。 - 程序配置
程序配置我们需要对索引路径进行定义,定义一些要排除的路径,比如C:\Windows、C:\ProgramData类似这样的路径。除此之外,我们还需要配置
结果的返回数量,结果显示排序方式,是否需要构建索引。这些配置信息我在代码中直接设置了默认值,此外我提供了一个properties文件,在这里用户可以自己定义要配置的信息,代码会优先读取文件中的配置信息,并做设置工作,如果文件为空,使用默认值。 - 核心业务代码
核心业务就是遍历本机中的所有文件,存储到数据库中,根据指定文件名搜索,返回结果。
我将业务拆分一下,首先就是要遍历本机中所有文件,遍历文件使用java中File的相关操作。为了提高效率,这里采用多线程来遍历,一个线程遍历一个盘符
public void buildIndex() {
//建立索引
DataSourceFactory.databaseInit(true);
HandlerPath handlerPath = config.getHandlerPath();
Set<String> includePaths = handlerPath.getIncludePath();
new Thread(() -> {
System.out.println("Build Index Started ...");
String startTime = Test.printTime();
System.out.println(startTime);
System.out.println();
final CountDownLatch countDownLatch = new CountDownLatch(includePaths.size());
for (String path : includePaths) {
executorService.submit(() -> {
fileScan.index(path);
countDownLatch.countDown();
});
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Build Index Complete ...");
String endTime = Test.printTime();
System.out.println