仁哥~头像

Java 将 SQLite 数据库打包到 Jar 包中的完整实践

1. 引言

在 Java 项目中,SQLite 因其轻量、无需独立服务端的特点,常被用作本地数据存储方案。然而,当我们需要将应用打包成可执行的 Jar 包分发时,数据库文件如何处理就成了一个常见问题:是随包携带一个预置的数据库文件,还是让程序在首次运行时自动创建?

本文将围绕「Java 将 SQLite 数据库打包到 Jar 包中」这一主题,介绍两种主流方案,并给出可直接运行的代码示例,帮助你解决打包与运行时数据库文件读取、写入的痛点。

2. 核心问题:Jar 包内的文件无法直接写入

在动手之前,先理解一个关键限制:Jar 包内的资源是只读的。

当我们把 SQLite 数据库文件(.db 或 .sqlite)作为资源放进 Jar 包后,程序可以通过 getResourceAsStream() 读取它,但无法直接对它进行写入操作。SQLite 的读写需要基于文件系统路径,而 Jar 包内的文件并不存在于真实的文件系统路径中。

因此,打包 SQLite 数据库的核心思路是:

  • 方案一:将预置数据库作为资源打包,首次运行时复制到用户目录或临时目录,之后读写该副本。
  • 方案二:不打包数据库文件,而是在首次运行时通过代码创建数据库和表结构。

下面分别介绍这两种方案。

3. 方案一:打包预置数据库,运行时复制到外部

这是最常用的方案,适用于需要随应用分发一份「初始数据」的场景(例如内置词典、默认配置数据)。

3.1 目录结构

src/main/resources/
└── db/
    └── app.db          # 预置的 SQLite 数据库文件

3.2 首次运行时复制数据库

import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class DatabaseInitializer {
   
   

    /** 数据库在 Jar 包内的资源路径 */
    private static final String RESOURCE_DB_PATH = "/db/app.db";

    /** 数据库在外部文件系统的存放位置(用户主目录下) */
    private static final String EXTERNAL_DB_DIR = System.getProperty("user.home") + "/.myapp";

    public static Path getOrCreateDatabase() throws Exception {
   
   
        Path dir = Paths.get(EXTERNAL_DB_DIR);
        if (!Files.exists(dir)) {
   
   
            Files.createDirectories(dir);
        }

        Path dbFile = dir.resolve("app.db");

        // 如果外部文件已存在,直接返回(避免覆盖用户数据)
        if (Files.exists(dbFile)) {
   
   

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/qq_30279827/article/details/166940191

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--