赞
踩
在开发Spring或者SpringBoot项目时,如果遇到需要使用resource资源文件夹下的文件做模板下载等功能时,直接使用File file = new File(xxx);
读取文件,在程序运行后,会发现,程序无论如何都无法读取到文件的问题。
使用org.springframework.core.io
包下的ClassPathResource
类读取文件
@Test
void test03() throws IOException {
File file = new ClassPathResource("templates/模板.xlsx").getFile();
if (!file.exists()) {
System.out.println("文件不存在");
}
System.out.println(file.getName());
}
代码写完后,点击运行,ide工具会将我们的代码编译打包然后运行,打包默认都是被打成了jar包。而在jar包中,我们的目标文件会被打到BOOT-INF/classes这个文件夹下,但是我们代码里读取文件的路径是src\main\resources\templates\模板.xlsx这两个资源路径完全不一样,所以当然是完全不可能读取到我们想要的文件的。
有人就会问了,那既然用File读取不到,那凭什么用你说的ClassPathResource就能读取到呢?
这里就要从ClassPathResource的实例化过程来说了。
在我们实例化ClassPathResource的时候,会初始化类加载器classLoader,然后把项目用到的所有路径都加载到类加载器里面,这些路径包括java运行环境的jar、maven项目的jar、当前项目打包后的jar等等
然后其实getFile()方法就是遍历这些文件路径,去这些路径下找我们的目标文件,这样就可以找到了。具体getFile()有点复杂,目前源码看得还是有点吃力,等以后再看。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。