Springboot应用启动后自动将jar包中的文件复制到指定位置

1. 需求

我们都知道采用Springboot有一个方便的地方,所有的依赖和静态文件,配置文件等最后都可以打成一个jar文件。在本项目中,为了方便用户的使用,数据库采用的是sqlite,且db文件也保存进了jar包中,现在需要读取这个文件,保存到指定的位置,这样后期升级jar文件,但用户的数据依然可以保留。

2.解决办法

由于是在jar文件中,因为常规的读取办法是读取不到该文件的。所以,在用IDE开发时能正常复制,打成 jar包就无法成功。

  • 采用ServletContextAware Springboot启动后自动运行
  • 采用类加载器来读取resources目录下的文件
  • 采用字节流读取复制到指定文件

3.代码

文件存放位置如图:
在这里插入图片描述
代码如下:

@Component
public class TestStarted implements ServletContextAware {
    /**
     * 复制sqlite数据库文件到./sqlite/financial.db。仅当该文件不存在时复制。
     * 在填充普通bean属性之后但在初始化之前调用
     * 类似于initializingbean的afterpropertiesset或自定义init方法的回调
     */
    @Override
    public void setServletContext(ServletContext servletContext) {
        try {
            File dbFile = new File("./sqlite/financial.db");
            if (!dbFile.exists()) {
                //读取的关键步骤
                InputStream fis = this.getClass().getClassLoader().getResourceAsStream("sqlite/financial.db");
                //创建目录
                File db = new File("./sqlite");
                if (!db.exists() || !db.isDirectory()) {
                    db.mkdir();
                }
                dbFile.createNewFile();
                FileOutputStream fos = new FileOutputStream("./sqlite/financial.db");
                byte[] bytes = new byte[1024];
                int len = 0; 
                while ((len = fis.read(bytes)) != -1) {
                    fos.write(bytes, 0, len);
                }
                
                fis.close();
                fos.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值