className.class.getResourceAsStream()与ClassLoader.getSystemResourceAsStream() 的区别

来源:互联网 发布:一元云购源码干嘛用的 编辑:程序博客网 时间:2024/05/22 09:22
className.class.getResourceAsStream :

一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类Test.class ,同时有资源文件config.properties

那么,应该有如下代码:

//前面没有“/”代表当前类的目录

InputStream is1 = Test.class.getResourceAsStream("config.properties");
System.out.println(is1);// 不为null

第二:在Test.class目录的子目录下,例如:com.x.y 下有类Test.class ,同时在 com.x.y.prop目录下有资源文件config.properties

那么,应该有如下代码:

//前面没有“/”代表当前类的目录

InputStream is2 = Test.class.getResourceAsStream("prop/config.properties");
System.out.println(is2);//不为null

第三:不在同目录下,也不在子目录下,例如:com.x.y 下有类Test.class ,同时在 com.m.n 目录下有资源文件config.properties

那么,应该有如下代码:

//前面有“/”,代表了工程的根目录

InputStream is3 = Test.class.getResourceAsStream("/com/m/n/config.properties");

System.out.println(is3);//不为null

ClassLoader.getSystemResourceAsStream :

和className.class.getResourceAsStream 的第三种取得的路径一样,但少了“/”

InputStream is4 = ClassLoader.getSystemResourceAsStream("properties/PayManagment_Config.properties");

System.out.println(is4);//不为null

转载自:http://www.blogjava.net/icewee/archive/2012/05/04/377371.html


理解 Class.getResourceAsStream() 


ClassLoader提供了两个方法用于从装载的类路径中取得资源:  

 
  public URL getResource(String name); 


  public InputStream getResourceAsStream(String name);  


这里name是资源的类路径,它是相对与“/”根路径下的位置。getResource得到的是一个URL对象来定位资源,而

getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据。  


然而,程序中调用的通常并不是ClassLoader的这两个方法,而是Class的getResource和getResourceAsStream方法,因为Class对象可以从你的类得到(如YourClass.class或YourClass.getClass()),而ClassLoader则需要再调用一次YourClass.getClassLoader()方法,但根据JDK文档的说法,Class对象的这两个方法其实是“委托”(delegate)给装载它的ClassLoader来做的,所以只需要使用Class对象的这两个方法就可以了。  


举例说明:  
  mypackage.Hello.class.getResourceAsStream("/config/config.ini");  
从classpath下的config相对路径中读取config.ini 


理解Tools.class.getClassLoader().getResourceAsStream(file):
 首先,调用对象的getClass()方法是获得对象当前的类类型,这部分数据存在方法区中,而后在类类型上调用
getClassLoader()方法是得到当前类型的类加载器,在Java中所有的类都是通过加载器加载到虚拟机中的,而且类加
载器之间存在父子关系,就是子知道父,父不知道子,这样不同的子加载的类型之间是无法访问的(虽然它们都被放
在方法区中),所以在这里通过当前类的加载器来加载资源也就是保证是和类类型同一个加载器加载的。 
最后调用了类加载器的getResourceAsStream()方法来加载文件资源


原创粉丝点击