Class.getResourceAsStream和ClassLoader.getResourceAsStream方法

项目中, 有时候要读取当前classpath下的一些配置文件,下面介绍下Class.getResourceAsStream和ClassLoader.getResourceAsStream两种方法以及二者的区别。
关于Java类加载机制,能够参考另外一篇随笔:http://www.cnblogs.com/clarke157/p/7295493.html
 

1. Class.getResourceAsStream

首先, 咱们必须先了解根路径“/”是如何定义的,这对咱们使用getResourceAsStream准确加载文件是很重要的。首先,咱们要明白这个根路径是对应类所处类路径上的根目录!什么意思呢?假如一个项目通过编译以后生成了以下class文件和目录结构:
com  
   |-github  
          |-test  
          |    |-Test1.class  
          |    |-testdata1.txt  
          |-Test2.class  
          |-testdata2.tx2
在这样的编译输出目录下,文件"testdata1.txt"的绝对路径名为:"/com/github/demo/testdata1.txt文件"testdata2.txt"的绝对路径名为:"/com/github/testdata2.txt"
如同getResourceAsStream方法文档上的解释:以/开头时是绝对路径,与类路径不一样的是路径上的“."换成了"/"。
 
接下着咱们看相对路径!
 
首先咱们必须明确“相对”路径老是指相对于当前class的路径!
 
例如,若是咱们使用
 
InputStream is= Test1.class.getResourceAsStream("testdata1.txt");
 
路径不是以/开头,说明这是一个相对路径,相对的是Test1.class这个文件,因此,这里的“testdata1.txt”所指的正确位置是与Test1.class处于同一目录下的testdata1.txt文件,这一文件是存在的,所引不会报错。
 
若是咱们按相对路径的方式经过Test1去加载testdata2.txt,则路径应该这样描述:
 
InputStream is= Test1.class.getResourceAsStream("../testdata2.txt");   
 
是的,用“.."表示上一级目录。
 
若是咱们按相对路径的方式经过Test2去加载testdata1.txt,则路径应该这样描述:   
 
InputStream is= Test2.class.getResourceAsStream("test/testdata1.txt");   
 

注意!test前是没有/的,这是一个相对路径,是相对于Test2所在包下的test子包里的testdata1.txt文件,因此这个路径也是正确无误的!

2. ClassLoader.getResourceAsStream

class.getResourceAsStream最终调用是ClassLoader.getResourceAsStream

在使用ClassLoader.getResourceAsStream时,路径直接使用相对于classpath的绝对路径,而且不能已 / 开头。
html

有如下规则:
1. 若是参数以/开头,则去除/。
java

2. 不然把当前类的包名加在参数的前面。


InputStream resourceAsStream = ClassLoader.getSystemResourceAsStream("com/github/demo/1.txt");
git

相关文章
相关标签/搜索