1、JavaFx,GUI编程
2、文件扫描、支持并发的文件扫描
3、扫描出的文件存储 ->搜索工作
持久化存储方案——数据库(sqlite:本地文件级别的数据库、一个库就是一个文件)
演示:新建一个maven项目,在pox.xml中添加依赖:
<dependencies>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.28.0</version>
</dependency>
</dependencies>
然后在本地新建一个文件夹,准备把数据库放入这个文件夹,
这就是简单的使用sqlite数据库。
刚才使用的数据库的路径是自己新建的绝对路径 E:\xiangmu\3数据库
如果用户没有这个地址,如何处理?
1、放在一个肯定存在的位置——C:\Users\bit
2、使用相对路径,程序放在哪,数据库文件就放在哪
3、给出用户提示,让用户选择
本次选择第二种解决方案。
给定一个文件夹进行扫描,A是数据库中之前扫描的结果,B是本次扫描的结果,正确结果应该是B。
新建一个类,进行文件属性的整理:
然后把上面扫描到的信息放入数据库中,先在target目录下建表:
public class ScanService {
private static final DataSource dataSource;
static {
SQLiteDataSource sqLiteDataSource = new SQLiteDataSource();
try {
String classesPath = GetClassPath.class.getProtectionDomain()
.getCodeSource().getLocation().getFile();
String decode = URLDecoder.decode(classesPath, "UTF-8");
File classesDir = new File(decode);
String dbPath = classesDir.getParent() + "/test.db";
sqLiteDataSource.setUrl("jdbc:sqlite://" + dbPath);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
dataSource = sqLiteDataSource;
}
public static void main(String[] args) throws SQLException {
createTable(); //建表
}
private static void createTable() throws SQLException {
String sql = "CREATE TABLE IF NOT EXISTS file_meta (\n" +
" id INTEGER PRIMARY KEY AUTOINCREMENT,\n" +
" name VARCHAR(50) NOT NULL,\n" +
" path VARCHAR(1000) NOT NULL,\n" +
" is_directory BOOLEAN NOT NULL,\n" +
" pinyin VARCHAR(50) NOT NULL,\n" +
" pinyin_first VARCHAR(50) NOT NULL,\n" +
" size BIGINT NOT NULL,\n" +
" last_modified TIMESTAMP NOT NULL\n" +
");";
try (Connection connection = dataSource.getConnection()) {
try (PreparedStatement s = connection.prepareStatement(sql)) {
s.executeUpdate();
}
}
}
}
建完表之后进行文件扫描:
这是扫描出的结果,还需要知道数据库中查询出的结果。
然后求他们两个的集合:
scanResult - queryResult : INSERT到数据库中。
queryResult - scanResult : 从数据库中删除。
还有就是支持拼音搜索功能:
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
项目开始前准备工作就结束了。