【Java基础】通过getResourceAsStream() 加载资源文件

时间:2022-12-16 06:12:46
  1. Class.getResourceAsStream(String path)

    • path不以“/”开头时,默认是从当前类所在的包下面获取资源
    • path以“/”开头时,则是从项目的classPath根下获取资源

    JDK设置这样的规则,是很好理解的,path不以“/”开头时,我们就能获取与当前类所在的路径相同的资源文件,而以“/”开头时可以获取classPath根下任意路径的资源。

  2. ClassLoader.getResourceAsStream(String path)

    • 默认是从classpath根下获取,path不能以“/”开头,path是指类加载器的加载范围,在资源加载的过程中,使用逐级向上的委托的形式加载的,“/”表示Boot ClassLoader中的加载范围,因为这个类加载器是C++实现的,所以加载范围为null。
  3. ServletContext.getResourceAsStream(String path)

    • 默认从WebAPP根目录下取资源,Tomcat下path是否以“/”开头无所谓,当然这和具体的容器实现有关。
  4. 问题

    今天在测试Class.getResourceAsStream()获取当前类所在包下面的资源文件时,一直无法正常获取,总是返回null。花了很多时间才发现Idea在编译类之后没有把我包下面的配置文件copy过去。因为Idea从13版本开始只支持外部编译,因此需要在pom.xml文件手动指定资源文件的目录。在maven中添加了以下配置之后,包下面的配置文件也就copy过去了,所以再次运行代码的时候就ok了。

    <build>
    <finalName>smart</finalName>
    <resources>
    <resource>
    <directory>src/main/java</directory><!--指定资源文件目录-->
    </resource>
    </resources>
    </build>

参考文章

  1. http://swiftlet.net/archives/868
  2. http://blog.csdn.net/zhanghaipeng1989/article/details/19332489
  3. http://blog.163.com/moonlight_yz/blog/static/74736722013111052554300/