• 仿everything的文件搜索工具项目详解:Part2


    目录

    代码架构

    基本架构

    开发语言:Java8

    数据库:SQLite

    JavaFX

    多线程

    文件IO流

    Lombok

    Atomic原子类

    项目难点

    主要数据结构

    数据表

    FileMeta

    FileScannerCallBack接口及其子类

    FileSave2DB

    FileScanner

    FileSearch

    Util包

    Controller

    1.通过选择的文件夹扫描内容。

     2.刷新页面,展示内容


    代码架构

    架构如下:

    基本架构

    开发语言:Java8

    主要还是看重了Java语言跨平台的特性,使此项目程序不仅可以在windows上运行,也可以在如mac,Linux等os上运行。

    数据库:SQLite

    SQLite这种嵌入式数据库的最重要特点就是轻量化,它的数据储存高效,查询也很简单。

    SQLite数据库很适合中小型数据的存储,很适合我们要完成的需求。

    若想使用SQLite数据库我们也不需要进行任何安装和配置,只需要拷贝计算机中的SQLite库并创建即可。

    JavaFX

    旨在对我们的项目程序提供可视化设计,供用户使用程序。

    当用户使用程序时,可以很容易理解如何进行操作,并且对查询到的信息一目了然。

    多线程

    在扫描文件时,我们采用多线程方式实现,更快速地进行文件扫描,提高搜索效率。

    我们通过创建线程池的方式来承载扫描文件线程。

    文件IO流

    用于遍历并且捕获扫描到的文件的信息,并将最新的文件信息放到数据库中。

    Lombok

    添加lombok依赖可以帮助我们将代码简化,通过注解方式即可完成一些我们经常需要用到的常规代码,提高我们开发时的效率

    Atomic原子类

    需要使用AtomicInteger来保证一些由于线程而发生++的值的原子性,避免线程不安全。

    项目难点

    1.关于如何进行文件的扫描,如何于数据库连接,如何将扫描到的最新文件信息放到数据库中,并且将数据库中的旧信息删掉。

    2.如何进行多线程的运用,在提高效率的同时保证线程安全,并且在何时关闭线程池。

    3.如何进行模糊搜索


    主要数据结构

    接下来我们讲一下本项目数据结构,我基本是从上一个类引出下一个类这个关系去写的。

    数据表

    本项目只有一个数据表,记录了文件的详细信息。

    用init.sql命名

    1. --drop table if exists file_meta;
    2. create table if not exists file_meta(
    3. name varchar(50) not null,
    4. path varchar(100) not null,
    5. is_directory boolean not null,
    6. size bigint,
    7. last_modified timestamp not null,
    8. pinyin varchar(200),
    9. pinyin_first varchar(50)
    10. );

    现在我们思考,若想建立出这么一张表,我们需要建立哪些类。

    FileMeta

    首先,我们需要建立一个包含整合了所有单行表信息的类,我们命名为FileMeta。

    可以说,我们所有的扫描操作都要先保存到FileMeta对象中,再将此对象中的内容保存到数据库中

    在这个类中,我们会使用Lombok的一些注解,以增加效率。

    FileScannerCallBack接口及其子类

    本接口及其子类用于FileMeta的属性填写。

    文件的扫描接口,只有一个callback方法。

    包含两个子类,一个可以用于网络扫描,一个用于本地扫描,我们本项目只实现本地扫描的子类。

    FileSave2DB

    继承接口的子类,用于具体扫描方法的实现,通过覆写callback方法,并且加上子类自我实现的添加,删除,查询数据库信息的各个方法,最后对比出最新的结果写入数据库。

    FileScanner

    根据上文,我们已经创建出了一个类来实现具体的文件扫描,而FileScanner的职责,便是利用上面类的方法,并且通过建立线程池,利用多线程的方式进行文件及子文件夹进行扫描。是此项目的重中之重。为避免线程安全问题,我们会使用原子类AtomicInteger

    FileSearch

    此时通过FileScanner,我们已经得到了数据库中的最新信息,这时候再根据文件的路径以及可能存在的用户搜索框中模糊查询的内容对数据库进行查询,并且将List内容返回,用于界面展示。

    Util包

    Util更多起到一种配置的作用,例如:

    如何通过文件名称得到拼音及首字母,

    创建DataBase的单例,连接数据库,创建数据表

    以及一些时间,文字格式上的配置,全部来自Util

    Controller

    谜底就在谜面上,可以认为是整个程序的扫描开关,如果说我们是通过Main方法打开文件,那么Controller类就是用来开启文件扫描的。

    它最主要的方法有两个:

    1.通过选择的文件夹扫描内容。

    此方法的内核在于将文件最新信息保存到数据库中,并删除旧信息 

     2.刷新页面,展示内容

    根据选择目录以及用户在文本框中输入的模糊搜索内容寻找数据库信息,进行页面内容展示

     

  • 相关阅读:
    Spring常见问题解决 - @RequestParam和@PathVariable的区别以及400报错问题
    Java Hello World 程序
    VHDL菜鸟入门到精通之激励文件编写
    解决go-micro与其它gRPC框架之间的通信问题
    Vue笔记-vue中使用JS创建的函数
    删除list中除最后一个之外所有的数据
    CSDN竞赛第四期季军 解题思路及参赛经历分享
    【愚公系列】华为云系列之DevCloud+ECS+MySQL搭建超级冷笑话网站【开发者专属集市】
    Simple Linear Regression:ONE
    斯伯克CYBELEC触摸屏维修CybTouch12折弯机特点
  • 原文地址:https://blog.csdn.net/weixin_65278827/article/details/126603659