当前位置:   article > 正文

Spring、SpringBoot使用File无法读取resource文件夹下的文件_springboot读取不到resource下的文件

springboot读取不到resource下的文件

1.问题描述

在开发Spring或者SpringBoot项目时,如果遇到需要使用resource资源文件夹下的文件做模板下载等功能时,直接使用File file = new File(xxx);读取文件,在程序运行后,会发现,程序无论如何都无法读取到文件的问题。
2023-07-06-10-02-36-image.png
2023-07-06-10-04-51-image.png

2.解决方法

使用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());
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2023-07-06-10-09-10-image.png

3.原因及解决方法解析

3.1原因

代码写完后,点击运行,ide工具会将我们的代码编译打包然后运行,打包默认都是被打成了jar包。而在jar包中,我们的目标文件会被打到BOOT-INF/classes这个文件夹下,但是我们代码里读取文件的路径是src\main\resources\templates\模板.xlsx这两个资源路径完全不一样,所以当然是完全不可能读取到我们想要的文件的。
在这里插入图片描述

3.2为什么用ClassPathResource就能读取到?

有人就会问了,那既然用File读取不到,那凭什么用你说的ClassPathResource就能读取到呢?
这里就要从ClassPathResource的实例化过程来说了。
在我们实例化ClassPathResource的时候,会初始化类加载器classLoader,然后把项目用到的所有路径都加载到类加载器里面,这些路径包括java运行环境的jar、maven项目的jar、当前项目打包后的jar等等
在这里插入图片描述
在这里插入图片描述

然后其实getFile()方法就是遍历这些文件路径,去这些路径下找我们的目标文件,这样就可以找到了。具体getFile()有点复杂,目前源码看得还是有点吃力,等以后再看。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/815989
推荐阅读
相关标签
  

闽ICP备14008679号