仿照 everthing 设计文件搜索引擎,相对于 everthing 支持跨平台的使用,这是因为Java是跨平台的。
功能简单,主要是阶段性验收学习成果,以及练习多线程编程
🐟 选用数据库:SQLite (主要是小(几MB),轻量化,嵌入式的数据库,文件搜索系统在实现过程中只需要调用一张表)
🐟 选择环境语言:Java8 + JavaFX
🐟 项目管理工具:maven,方便进行第三方 jar 包的导入和管理,方便对当前项目的整个生命周期的掌握。
🐟 插件:lombok
🐳 选择文件夹多线程扫描该文件夹下的子文件,展示文件的名称、路径、大小和修改时间。
🐳 选择路径后,支持搜索相关文件内容,支持文件部分名、全拼或者是首字字母,支持模糊查询。
🐳 文件夹扫描完毕之后,显示搜索的所有文件以及文件夹个数,以及查询时间
分隔符🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀分隔符
分隔符🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀分隔符
💧 依赖添加
💧 数据库创建和连接
💧 前端页面设计
文件名有可能是中文的,所以想要实现文件名搜索,需要把汉字字符转换成字母,但是汉字是存在多音字的,所以需要一个工具类,帮我们把中文字符转换为字母字符串的形式,这样就可以支持模糊查找。
e.g. 七七冲鸭 ➡️ qiqichongya / qqcy
-
- <dependency>
- <groupId>com.belerwebgroupId>
- <artifactId>pinyin4jartifactId>
- <version>2.5.1version>
- dependency>
工具类的代码设计:
- package util;
-
- import net.sourceforge.pinyin4j.PinyinHelper;
- import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
- import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
- import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
-
-
- /**
- * @Author qiqichongya
- * @Date 2022/8/26 18:28
- * @PackageName:util
- * @ClassName: PinyinUtil
- * @Description: 拼音工具类
- * 将及汉语拼音的字符映射到字母字符串中
- */
- public class PinyinUtil {
- // 定义汉语拼的配置:全局变量,必须时全局唯一的且在定义时就要初始化
- private static final HanyuPinyinOutputFormat FORMAT;
-
- static {
- // 当 PinyinUtil类加载时执行静态代码块,除了可以产生对象外,还可以进行一些配置相关的工作
- FORMAT = new HanyuPinyinOutputFormat();
- // 设置转换之后的英文字母都是英文小写字母
- FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);
- }
-
- /**
- * 传入任意的文件名称,就能将该文件名称转为字母字符串全拼和首字母小写字符串
- * 若文件名是由中文和英文或数字组成,只需要转换中文即可。
- * e.g. 七七chongya666 --> qiqichongya666 / qqchongya666
- *
- * @param fileName
- * @return
- */
- public static String[] getPinyinByFileName(String fileName) {
- // 第一个字符串用来存放文件名全拼
- // 第二个字符串用来存放首字母
- String[] ret = new String[2];
- // 全拼
- StringBuilder allNameSpells = new StringBuilder();
- // 首字母
- StringBuilder firstCaseSpells = new StringBuilder();
-
- for (char c : fileName.toCharArray()) {
- try {
- String[] pinYins = PinyinHelper.toHanyuPinyinStringArray(c, FORMAT);
- if (pinYins == null || pinYins.length == 0) {
- // 说明碰到非中文的字符,保留
- allNameSpells.append(c);
- firstCaseSpells.append(c);
- } else {
- // 碰到了中文字符
- allNameSpells.append(pinYins[0]);
- firstCaseSpells.append(pinYins[0].charAt(0));
- }
- } catch (BadHanyuPinyinOutputFormatCombination e) {
- allNameSpells.append(c);
- firstCaseSpells.append(c);
- e.printStackTrace();
- }
- }
- ret[0] = allNameSpells.toString();
- ret[1] = firstCaseSpells.toString();
- return ret;
- }
- }
怎末导入SQLite数据库,以及连接操作?三步走战略:创建 + 连接 + 执行 +(关闭)
首先在maven中导入SQLite依赖:
-
- <dependency>
- <groupId>org.xerialgroupId>
- <artifactId>sqlite-jdbcartifactId>
- <version>3.36.0.3version>
- dependency>
创建SQLite数据源:
创建数据库连接
A、拿到SQLite数据源a、配置数据库的欢号窟码、曰期格式等
b、配置本和上数据库的路经和uKL
/** 对于SQLite来说,没有服务端和客户端,因此只需指定SQLite数据的地址就行了 **/
B、拿到数据库连接(从数据源拿到数据库连接)
C、执行 Statement 的查询或更新方法。
executeuery() : resultset对象,存储诸返回信息
executeupdata ():int 执行更新后的修改的行数
D、关闭连接释放资源 (statement 或 preparedstatement)
需要注意的点:
1. 因为配置数据源的URL是SQLite子类中独有的方法,所以要向下转型
2. 由于SQLite不像MySql那样由定义好的日期格式,所以这里需要手动定义一下日期格式。
- package util;
-
- import org.sqlite.SQLiteConfig;
- import org.sqlite.SQLiteDataSource;
-
- import javax.sql.DataSource;
- import java.io.File;
- import java.sql.*;
-
- /**
- * @Author qiqichongya
- * @Date 2022/7/17 15:44
- * @PackageName:util
- * @ClassName: DataBaseUtil
- *