SpringBoot项目打包为jar包运行,写入文件时报java.io.FileNotFoundException

问题描述

最近写操作配置文件的接口,文件放在Resource目录下新建的setting文件夹里,目标是实现读取和修改文件内容。
在IDE上运行时,读取和修改文件的接口都能正常使用;但是当把项目打包成jar包运行时,读取文件的接口还能使用,但写入文件时就报java.io.FileNotFoundException,部分读取及写入的代码如下:

// 读取文件内容
... ...
ClassPathResource classPathResource = new ClassPathResource("settings/test.json");
InputStream inputStream = classPathResource.getInputStream();
// 将输入流转为字符串
... ...

// 写入文件内容
... ...
// content为要写入的内容
ClassPathResource classPathResource = new ClassPathResource("settings/test.json");
File file = classPathResource.getFile();
if (!file.exists()) {
    file.mkdirs();
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write(content);
bufferedWriter.flush();
... ...

问题分析

当在IDE中运行项目时,IDE将java文件编译后是将整个项目放置于target目录下,此时对应的文件及路径都是存在的,因此按路径访问文件不管是读取还是写入都是可以的。但是当把项目打包为jar包之后整个项目成为了一个文件,因此再按照路径访问文件就访问不到了。
那么,为什么打包为jar包之后读取文件的接口还能使用呢?上面的方法底层其实是通过类加载器来读取文件流的,类加载器是可以读取jar包中的文件的。

解决方案

采用的解决方案是在jar包同级目录新建settings文件夹,将要操作的文件放进去,而代码中则以jar包文件为准,按相对路径对文件进行访问,代码修改成:

// 读取文件内容
... ...
// ClassPathResource classPathResource = new ClassPathResource("settings/test.json");
// InputStream inputStream = classPathResource.getInputStream();
File file = new File("settings/test.json");
if (!file.exists()) {
    return null;
}
InputStream inputStream = new FileInputStream(file);
// 将输入流转为字符串
... ...

// 写入文件内容
... ...
// ClassPathResource classPathResource = new ClassPathResource("settings/test.json");
// File file = classPathResource.getFile();
File file = new File("settings/test.json");
if (!file.exists()) {
    file.mkdirs();
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write(content);
bufferedWriter.flush();
... ...

然后再将项目打包为jar包运行,这下读取和修改文件内容的接口都能正常使用了。

PS:这种写法在IDE中运行是不行的

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值