首先粘取二者的API:
Class类:
getResourceAsStream
public InputStream getResourceAsStream(String name)
-
查找具有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的
class loader 实现的。此方法委托此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给
ClassLoader.getSystemResourceAsStream(java.lang.String)
。在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:
- 如果 name 以 '/' 开始 ('\u002f'),则绝对资源名是 '/' 后面的 name 的一部分。
- 否则,绝对名具有以下形式:
modified_package_name/name
其中 modified_package_name 是此对象的包名,该名用 '/' 取代了 '.' ('\u002e')。
-
-
-
参数:
-
name
- 所需资源的名称
返回:
-
一个
InputStream
对象;如果找不到带有该名称的资源,则返回 null
抛出:
-
NullPointerException
- 如果 name 是 null
从以下版本开始:
- JDK1.1
-
ClassLoader类:
getResourceAsStream
public InputStream getResourceAsStream(String name)
-
返回读取指定资源的输入流。
getResource(String)
的文档中描述了搜索顺序。 -
-
参数:
-
name
- 资源名称
返回:
- 用于读取资源的输入流,如果无法找到资源,则返回 null 从以下版本开始:
- 1.1
-
从API上可以看出,Class也委托了类加载器进行读取资源,只是在对资源的定位上使用了不同的方式;从功能上讲,两个都可以用于从 classpath 里面进行资源读取, classpath包含classpath中的路径和classpath中的jar。
两个方法的区别是资源的定义不同,一个主要用于相对与一个对象取资源,而另一个用于取相对于classpath的资源,用的是绝对路径。
在使用Class.getResourceAsStream 时,资源路径有两种方式:
1、以 / 开头,则这样的路径是指定绝对路径;
2、不以 / 开头,则路径是相对与这个class所在的包的。
在使用ClassLoader.getResourceAsStream时,路径直接使用相对于classpath的绝对路径。