getResourceAsStream 用法大致有以下几种:
- 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类me.class ,同时有资源文件myfile.xml ,那么,应该有如下代码:
me.class.getResourceAsStream("myfile.xml"); - 在me.class目录的子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.y.file 目录下有资源文件myfile.xml ,那么,应该有如下代码:
me.class.getResourceAsStream("file/myfile.xml"); - 不在me.class目录下,也不在子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.file 目录下有资源文件myfile.xml ,那么,应该有如下代码:
me.class.getResourceAsStream("/com/x/file/myfile.xml");
总结:
- “ / ”代表了工程的根目录,例如工程名叫做myproject,“ / ”代表了myproject
me.class.getResourceAsStream("/com/x/file/myfile.xml"); - 前面没有 “ / ” 代表当前类的目录
me.class.getResourceAsStream("myfile.xml");
me.class.getResourceAsStream("file/myfile.xml");
最后:
getResourceAsStream读取的文件路径只局限与工程的源文件夹中,包括在工程src根目录下,以及类包里面任何位置,但是如果配置文件路径是在除了源文件夹之外的其他文件夹中时,该方法是用不了的。
总结:路径前不带'/',则是相对路径;若带,则是绝对路径。(这个绝对只是在工程内的绝对,并不绝对于磁盘)
这个方法的内部实现主要是依赖于类加载器,一般的自己实现的类是用AppClassLoader的getResourceAsStream()方法,如果是java.lang.Object这种类就是bootstrap类加载器的getSystemResourceAsStream(java.lang.String)方法。Tomcat实现的则是通过自己在java.lang.ClassLoader基础上扩展的webAppLoader实现类加器,再调用getResourceAsStream().