search-everything项目
项目简介
仿照Everything的文件搜索软件,但是Everything只支持windows系统,此项目由java实现,支持多平台的使用
项目的技术:
Java8+JavaFX+多线程+IO流+SQLite数据库
扫描文件夹时,多线程扫描,效率大大提升
SQLite嵌入式数据库,小型数据库,占用资源低,小巧轻便
基本功能
- 选择一个文件夹,多线程搜索该文件夹下的子文件,展示文件的名称,路径,大小,修改时间以及是否为文件夹
- 选择路径后,支持搜索该路径下的相关文件内容,支持模糊搜索(首字母,全拼,文件名)
导入的依赖和插件
1.将汉字转换成对应的拼音字符串
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
2.SQLite数据库包
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.36.0.3</version>
</dependency>
3.lombok开发包:
用注解代替get,set等方法,避免代码冗余
@Date:注入属性的getter和setter方法
@EqualsAndHashCode:注入equals放啊和hashcode法
@AllArgsConstructor:注入全部参数的有参构造
@ToString:注入toString方法
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
4.可执行jar包:指定项目从哪一个类进入
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!-- 指定入口类 -->
<mainClass>Main</mainClass>
<!-- 在jar的MF文件中生成classpath属性 -->
<addClasspath>true</addClasspath>
<!-- classpath前缀,即依赖jar包的路径 -->
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
5.在将代码打包的同时将导入的包也一并打包进去
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 指定依赖包的输出路径,需与上方的classpathPrefix保持一致 -->
<outputDirectory>${
project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
app.fxml文件:
前端界面展示的样子,配合control类使用,由前端开发人员完成
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.control.cell.*?>
<GridPane fx:id="rootPane" alignment="center" hgap="10" vgap="10" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="app.Controller">
<children>
<Button onMouseClicked="#choose" prefWidth="90" text="选择目录" GridPane.columnIndex="0" GridPane.rowIndex="0" />
<Label fx:id="srcDirectory">
<GridPane.margin>
<Insets left="100.0" />
</GridPane.margin>
</Label>
<TextField fx:id="searchField" prefWidth="900" GridPane.columnIndex="0" GridPane.rowIndex="1" />
<TableView fx:id="fileTable" prefHeight="1000" prefWidth="1300" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.rowIndex="2">
<columns>
<TableColumn fx:id="nameColumn" prefWidth="220" text="名称">
<cellValueFactory>
<PropertyValueFactory property="name" />
</cellValueFactory>
</TableColumn>
<TableColumn prefWidth="400" text="路径">
<cellValueFactory>
<PropertyValueFactory property="path" />
</cellValueFactory>
</TableColumn>
<TableColumn fx:id="isDirectory" prefWidth="90" text="文件类型">
<cellValueFactory>
<PropertyValueFactory property="isDirectoryText" />
</cellValueFactory>
</TableColumn>
<TableColumn fx:id="sizeColumn" prefWidth="90" text="大小(B)">
<cellValueFactory>
<PropertyValueFactory property="sizeText" />
</cellValueFactory>
</TableColumn>
<TableColumn fx:id="lastModifiedColumn" prefWidth="160" text="修改时间">
<cellValueFactory>
<PropertyValueFactory property="lastModifiedText" />
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
</children>
</GridPane>
类概述
Contoller:配合界面文件app.fxml使用,界面中的数据交给这个类来执行,特是通过这个类写回界面
FileMeta:存储每个文件的相关信息,每一个实例化对象都对应数据库中的一条数据
FileScannerCallback:回调接口
SaveToDB:回调接口的具体实现类,将扫描到的信息存储到数据库中
FileScanner:根据选择的文件夹扫描文件
FileSearch:根据搜索框中输入的数据搜索数据库
DBInit:读取init.sql,进行数据库的初始化操作
DBUtil:提供数据库的数据源,创建数据库的连接,关闭连接等操作
PinyinUtil:配置拼音格式,将汉字转换成字符串
Util:通用工具类
app.fxml:界面文件
init.sql:初始化数据库的语句资源
数据库的初始化文件
即init.sql中的语句
--drop table if exists file_meta;
create table if not exists file_meta(
name varchar(50) not null,
path varchar(100) not null,
is_directory boolean not null,
size bigint,
last_modified timestamp not null,
pinyin varchar(200),
pinyin_first varchar(50)
);
前五项是需要展示在界面上的内容,而拼音首字母和拼音全拼只存储在数据库中供搜索使用,并不显示在界面上
通用工具类
提供其它类中会用到的通用工具
public class Util {
//数据库的日期格式
public static final String DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
//是否为文件夹以汉字显示而非ture,false或1,0
public static String parseDirectory(Boolean directory) {
return directory?"文件夹":"文件";