项目:
仿照 everthing 设计文件搜索引擎,相对于 everthing 支持跨平台的使用,这是因为Java是跨平台的。
原因:
功能简单,主要是阶段性验收学习成果,以及练习多线程编程
使用的环境和工具:
🐟 选用数据库:SQLite (主要是小(几MB),轻量化,嵌入式的数据库,文件搜索系统在实现过程中只需要调用一张表)
🐟 选择环境语言:Java8 + JavaFX
🐟 项目管理工具:maven,方便进行第三方 jar 包的导入和管理,方便对当前项目的整个生命周期的掌握。
🐟 插件:lombok
实现功能:
🐳 选择文件夹多线程扫描该文件夹下的子文件,展示文件的名称、路径、大小和修改时间。
🐳 选择路径后,支持搜索相关文件内容,支持文件部分名、全拼或者是首字字母,支持模糊查询。
🐳 文件夹扫描完毕之后,显示搜索的所有文件以及文件夹个数,以及查询时间
分隔符
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
分隔符
分隔符
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
分隔符
准备阶段:
💧
依赖添加
💧
数据库创建和连接
💧
前端页面设计
第一天
💧
依赖添加
🙋 🙋 问题一:🙋 🙋
文件名有可能是中文的,所以想要实现文件名搜索,需要把汉字字符转换成字母,但是汉字是存在
多音字
的,所以需要一个工具类,帮我们把中文字符转换为字母字符串的形式,这样就可以支持模糊查找。
e.g. 七七冲鸭 ➡️ qiqichongya / qqcy
<!--汉语言拼音处理工具-->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</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依赖:
<!-- SQLite数据库-->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.36.0.3</version>
</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
*