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();
}
}
}