项目实战——基于Java8+JavaFX+多线程+文件IO+SQLite数据库实现的本地文件快速搜索引擎详细设计实现

目录

一、前言介绍

二、功能展示

2.1选择所要查找的文件夹

 2.2将所选目录下的所有文件进行属性展示

 2.3支持搜索框查询文件(模糊查询)

2.4统计本次扫描信息

​编辑 

 三、整体设计

3.1工具类的设计

3.1.1汉字转拼音工具类

3.1.2数据库工具类的实现

3.1.3界面的实现

3.2文件扫描及保存的设计

3.2.1回调函数的设计及文件扫描类的设计

四、项目总结


一、前言介绍

        对于许多不爱整理电脑的小伙伴来说(自然我也是其中之一),在一堆堆的文件夹和文件里找到自己需要的文件是非常令人头疼的。而且当文件夹越来越多之后,总是会遗忘掉自己将文件塞在了哪个犄角旮旯,于是乎,本地文件搜索引擎就是非常关键的了!那么,为什么不用系统自带的搜索引擎呢?速度太慢!!!当搜索文件夹内容过多时,很久也无法完成。于是乎,在网络上寻找,找到了Everything这样的一个小工具,觉得十分好用,能快速通过关键字索引找到文件信息;不过用了一段时间之后,还是觉得差点意思。第一:查询不够方便,必须要记得完整的关键字才可以准确查找;第二:不支持跨系统;于是乎,决定自己实现一个文件搜索工具来解决这些问题。

二、功能展示

        那么首先需要搞清楚需要的功能有哪些,也非常简单:

  1. 需要快速搜索本地文件及文件属性展示;
  2. 选择路径后,支持搜索相关文件内容(支持模糊查询:拼音、首字母等);
  3. 统计本次扫描信息;

所需功能明确之后,便开始根据所掌握技能进行整体思路设计,这里先给出功能实现截图:

2.1选择所要查找的文件夹

 2.2将所选目录下的所有文件进行属性展示

 2.3支持搜索框查询文件(模糊查询)

 

2.4统计本次扫描信息

 三、整体设计

3.1工具类的设计

3.1.1汉字转拼音工具类

        因为我们的功能列表中提到了要支持汉字或者拼音、首字母等的模糊查询,所以我们需要有一个工具,能帮我们将任意的中文字符转变为字母字符串从而支持我们的模糊查找,如:快速排序 => kuaisupaixu / kspx;

        这里我们在Maven项目的pom文件中引入一个jar包:

<dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.1</version>
</dependency>

而所谓jar包其实就是一系列编译好的class文件,jar包其实就是一个压缩包;

引入之后,我们就可以进行拼音工具类的编码了,代码如下:

/**
 * 拼音工具类
 * 将汉语拼音的字符映射为字母字符串
 **/
public class PinyinUtil {
    //定义汉语拼音的配置,全局常量,必须在定义时初始化,全剧唯一。
    //这个配置就表示将汉字字符转为拼音字符串时的一些设置。
    private static final HanyuPinyinOutputFormat FORMAT;
    //所有中文对应的Unicode编码区间
    private static final String CHINESE_PATTERN = "[\\u4E00-\\u9FA5]";

    //静态代码块,在进行一些项目配置时的初始化操作。
    static {
        //当PinyinUtil类加载的时候执行静态代码块,除了产生对象外,还可以进行一些配置相关的东西
        FORMAT = new HanyuPinyinOutputFormat();
        //设置转换后的英文字母为全小写
        FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        //设置不带音调
        FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        //设置特殊拼音用V代替,绿
        FORMAT.setVCharType(HanyuPinyinVCharType.WITH_V);
    }

    /**
     * 判断给定的字符串是否包含中文
     * @param str 要判断的字符串
     * @return
     */
    public static boolean containsChinese(String str) {
        return str.matches(".*" + CHINESE_PATTERN + ".*");
    }

    /**
     * 传入任意的文件名称,就能将该文件名称转为字母字符串全拼和首字母小写字符串
     * 若文件名中包含其他字符,英文数字等,不需要做处理,直接保存
     * @param fileName
     * @return
     */
    public static String[] getPinyinByFileName(String fileName) {
        // 第一个字符串为文件名全拼,第二个字符串为首字母
        String[] ret = new String[2];
        StringBuilder allNameAppender = new StringBuilder();
        StringBuilder firstCaseAppender = new StringBuilder();
        for(char c : fileName.toCharArray()) {
            //不考虑多音字,就使用第一个返回值作为我们的参数
            try {
                String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c, FORMAT);
                if (pinyins == null || pinyins.length == 0) {
                    //碰到非中文字符,直接保留
                    allNameAppender.append(c);
                    firstCaseAppender.append(c);
                } else {
                    //碰到中文字符,取第一个多音字的返回值 he -> [he,huo,hu]
                    allNameAppender.append(pinyins[0]);
                    //he = h
                    firstCaseAppender.append(pinyins[0].charAt(0));
                }
            }catch (BadHanyuPinyinOutputFormatCombination e) {
                //碰到非中文字符,直接保留
                allNameAppender.append(c);
                firstCaseAppender.append(c);
            }
        }
        ret[0] = allNameAppender.toString();
        ret[1] = firstCaseAppender.toString();
        return ret;
    }

    public static void main(String[] args) {
        String s = "中华人民共和国China";
        System.out.println(Arrays.toString(getPinyinByFileName(s)));
    }
}

3.1.2数据库工具类的实现

        我们需要将扫描到的文件信息保存起来进行展示,既然要保存,那么首先想到的就是我们的数据库了。而数据库的选择又有很多种,这里我们选择SQLite数据库;那么问题来了?为什么不选择更熟悉的MySQL数据库呢?原因如下:

  • 我们的整个项目就是一个很小体量的文件搜索引擎,使用MySQL的话就增大了不必要的体量;
  • 而SQLite是一个很小体量的数据库,就这一个文件就是数据库,非常契合该项目;

         选择好数据库之后,我们开始进行数据源的创建和数据库连接的创建,代码如下:

/**
 * SQLite数据库的工具类,创建数据源,创建数据库的连接
 * 只向外部提供SQLite数据库的连接即可,数据源不提供(封装在工具类的内部)
 * JDBC四步走
 **/
public class DBUtil {
    //单例数据源
    private volatile static DataSource DATASOURCE;
    //
下一篇: 七大排序——看完这篇妈妈再也不担心我写不出排序算法了(附测试)
.wake up
博客等级 码龄6年 3粉丝 2原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值