1.Springboot访问项目根目录下的文件:
public static final String PROJECT_ROOT_DIRECTOR = System.getProperty("user.dir");
在本地Idea下访问是可以的,其对应本地的文件结构如下:
但是在打包成jar发布到线上服务器上会发现,存在问题。此时上面指定的文件夹是和jar同目录:
2.Springboot访问资源文件夹的路径:
补充知识:在springboot的resource下可以新建名称为static的目录,此目录是不安全的,可以直接外网访问,比如本地启动,static下有一个img/a.jpg,那么可以直接localhost:端口/服务名/img/a.jpg.前端页面也可以直接:src="img/a.jpg".
言归正传~~~~~~~~~~omg:
Q:访问resources/static/test.txt文件
2.1 传统方式:
File file = new File("src/main/resources/static/test.txt");
InputStream inputStream=new FileInputStream(file);
打包成jar后,jar文件的目录结构不会从src开始,jar文件中的资源,读取时必须使用流的方式。
File的构造参数必须是相对项目路径的根路径,如果项目下还有module,还需要添加module-name+src/main/....
结论:在idea上运行是可以的,但是打成jar包是会报文件找不到异常的File NOT FOUND EXCEPTION。
2.2 ResourceUtils工具类
File file = ResourceUtils.getFile("classpath:static/test.txt");
InputStream inputStream=new FileInputStream(file);
Idea启动没有问题;jar启动会报错:
class path resource [static/text.txt] cannot be resolved to absolute file path because it does not exist
(不能解析为绝对文件路径,因为它不在文件系统中)
结论:这种方式在idea上运行是可以的,但是打成jar包是会报文件找不到异常的。
2.3 ClassPathResource类
ClassPathResource classPathResource = new ClassPathResource("static/test.txt");
InputStream inputStream = classPathResource.getInputStream();
注意:此除必须用流读取:
如果使用类似下列方式获取路径地址:
classPathResource.getFile().getAbsoluteFile().toString();
则会报错:
class path resource [static/text.txt] cannot be resolved to URL because it does not exist
结论:Idea和jar都行。
附:jar解压的文件结构:
在IDEA中module-name下有src/main/java和src/main/resource两个文件夹,两个文件夹下的针对打出的jar来说都在BOOT-INF下。不含有src/main目录。
项目工程目录结构: