Java基础:getResourceAsStream(String path)用法

  项目中有用到读取 XML 文件数据到 InputStream,因对getResourceAsStream(String path)的用法不够了解,读到的总是空,问题已解决,总结如下。

三种方案说明

首先说明是基于 SSM 框架

  1. Class.getResourceAsStream(String path)

    path:不以/开头默认是相对路径,指的是当前类所在的包;以/开头指的是工程内的绝对路径,即以ClassPath为根路径,即开发环境的src目录,当导出war包后,以包里面WEB-INF/classes/为绝对根路径。

    通过查看该方法的原码,该方法加载文件时,调用该类的ClassLoadergetResourceAsStream(String path)方法。如果ClassLoader为空,说明该class是系统class,就委托给ClassLoader.getSystemResourceAsStream(String path)方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public InputStream getResourceAsStream(String name) {
    name = resolveName(name);
    ClassLoader cl = getClassLoader0();
    if (cl==null) {
    // A system class.
    return ClassLoader.getSystemResourceAsStream(name);
    }
    return cl.getResourceAsStream(name);
    }

    注意:开发环境需要将xml文件放在src根目录下,同时资源文件目录(config)也要放一份,打成war包后xml文件只有一份,两个地方的xml文件元素名必须相同,经测试值可以不同,打包和在开发环境运行所读的xml文件来自同一个路径的文件,至于是那个路径的文件,经测试打包和运行读取的是最新修改的文件。

    至于为什么要这样我也没搞清楚,SpringMVC 项目如果两份少了一份,就会报空的错误;其它框架的项目的文件要怎么放还未去研究。

    ====备注补充:2018-02-10===
    开发环境后面有试将src目录的xml文件删除,只保留资源目录config里的xml文件,运行可以跑成功,之前确实有报错,还是不明白。

  2. Class.getClassLoader.getResourceAsStream(String path)
    默认不以/开头或以/开头,都是从ClassPath根路径下获取资源。

  3. ServletContext.getResourceAsStream(String path)
    默认从WebAPP根目录获取资源,Tomcat容器下的path是否以/开头无所谓,当然这也和具体的容器实现有关。

方案示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Controller
@RequestMapping("/res")
public class XMLController {

@RequestMapping(value = "/xml", method = {RequestMethod.POST})
@ResponseBody
public void getXMLFileData(HttpServletRequest request){

//不以'/'开头,指向当前类所在的路径;以'/'开头指向当前'ClassPath'路径获取资源
// InputStream inputStream = this.getClass().getResourceAsStream("/student.xml");

//从'ClassPath'路径下获取资源
// InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("/student.xml");

ServletContext servletcontext = request.getSession().getServletContext();
//默认是webapp根目录下获取资源
InputStream inputStream = servletcontext.getResourceAsStream("student.xml");
}
}

Java基础:getResourceAsStream(String path)用法

http://blog.gxitsky.com/2018/03/21/Java-jdk-4-getResourceAsStream/

作者

光星

发布于

2018-03-21

更新于

2022-06-17

许可协议

评论