Class.getResourceAsStream() VS. ClassLoader.getResourceAsStream()
For Class.getResourceAsStream(String name),
- if the name parameter doesn't start with a "/", then it's a relative path to the class's package.
- If the name parameter starts with a "/", then it's an absolute path.
For ClassLoader.getResourceAsStream(String name),
- the name parameter is always an absolute path.
- and it can never start with a "/",if it does, the resource is never found.
If the file cannot be found, both methods return null and no exception is thrown.
The following program illustrates the difference.
Project structure
ResourceAsStream.java
public class ResourceAsStream { /**
* @param args
*/
public static void main(String[] args) {
String path1 = "a.properties";
String path2 = "/a.properties";
String path3 = "test/a.properties";
String path4 = "/test/a.properties"; System.out.println("Class.getResourceAsStream()");
InputStream is = ResourceAsStream.class.getResourceAsStream(path1);
System.out.println(path1 + " " + (is != null));
is = ResourceAsStream.class.getResourceAsStream(path2);
System.out.println(path2 + " " + (is != null));
is = ResourceAsStream.class.getResourceAsStream(path3);
System.out.println(path3 + " " + (is != null));
is = ResourceAsStream.class.getResourceAsStream(path4);
System.out.println(path4 + " " + (is != null));
System.out.println();
System.out.println("ClassLoader.getResourceAsStream()");
is = ResourceAsStream.class.getClassLoader().getResourceAsStream(path1);
System.out.println(path1 + " " + (is != null));
is = ResourceAsStream.class.getClassLoader().getResourceAsStream(path2);
System.out.println(path2 + " " + (is != null));
is = ResourceAsStream.class.getClassLoader().getResourceAsStream(path3);
System.out.println(path3 + " " + (is != null));
is = ResourceAsStream.class.getClassLoader().getResourceAsStream(path4);
System.out.println(path4 + " " + (is != null));
}
}
Result:
Class.getResourceAsStream()
a.properties true
/a.properties false
test/a.properties false
/test/a.properties true ClassLoader.getResourceAsStream()
a.properties false
/a.properties false
test/a.properties true
/test/a.properties false JDK explanation about this two method Class.java public InputStream getResourceAsStream(String name)
ClassLoader.getSystemResourceAsStream(java.lang.String)
.
Before delegation, an absolute resource name is constructed from the given resource name using this algorithm:
- If the
name
begins with a'/'
('\u002f'), then the absolute name of the resource is the portion of thename
following the'/'
. - Otherwise, the absolute name is of the following form:
modified_package_name/name
Where the
modified_package_name
is the package name of this object with'/'
substituted for'.'
('\u002e').
- If the
- Parameters:
name
- name of the desired resource- Returns:
- A
InputStream
object ornull
if no resource with this name is found - Throws:
NullPointerException
- Ifname
isnull
ClassLoader.java
public InputStream getResourceAsStream(String name)
Returns an input stream for reading the specified resource.
The search order is described in the documentation for getResource(String).
Parameters:
name - The resource name
Returns:
An input stream for reading the resource, or null if the resource could not be found
Since:
1.1
public URL getResource(String name)
Finds the resource with the given name. A resource is some data (images, audio, text, etc) that can be accessed by class code in a way that is independent of the location of the code.
The name of a resource is a '/'-separated path name that identifies the resource. --here it means absolute path
This method will first search the parent class loader for the resource; if the parent is null the path of the class loader built-in to the virtual machine is searched. That failing, this method will invokefindResource(String) to find the resource.
Parameters:
name - The resource name
Returns:
A URL object for reading the resource, or null if the resource could not be found or the invoker doesn't have adequate privileges to get the resource.
Since:
1.1
below from http://www.javaworld.com/article/2077404/core-java/got-resources-.html
Because Class.getResource() eventually delegates toClassLoader.getResource(), the two methods are indeed very similar.
However, the first method is often preferable. It provides a nice extra feature: it looks up package-local resources.
As an example, this code snippet getClass().getResource("settings.properties"); executed from a class some.pkg.MyClass
looks for a resource deployed a ssome/pkg/settings.properties.You might wonder why this is better then the equivalent
getClass().getClassLoader().getResource("some/pkg/settings.properties");
The reason is the possibility for future refactoring. Should you decide to rename pkgto betterpkgname and move all classes and resources into the new
package, the first code snippet requires no further code changes. The second code snippet embeds the old package name in a string literal—something that
is easy to forget and can become a runtime error later. Another advantage of Class.getResource() is that it does not require thegetClassLoader runtime
security permission, which the other approach requires.
I should mention a few extra details. Is it better to acquire the relevant Class object using the getClass() instance method or using MyClass.class?
The answer depends on whether you plan to have classes in other packages extend MyClass.
Since get Class() always returns the most derived class, it might return a class in a package different from some.pkg, possibly coded after MyClass is
conceived. If this is a possibility, you should safeguard against potential lookup errors by using the class literal syntax form, MyClass.class. As an added
benefit, it also works from static methods.
Class.getResourceAsStream() VS. ClassLoader.getResourceAsStream()的更多相关文章
- Class.getResourceAsStream和ClassLoader.getResourceAsStream方法
项目中,有时候要读取当前classpath下的一些配置文件,下面介绍下Class.getResourceAsStream和ClassLoader.getResourceAsStream两种方法以及两者 ...
- Class.getResourceAsStream()与ClassLoader.getResourceAsStream()的区别
Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致. 例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest.clas ...
- 对Class.getResourceAsStream和ClassLoader.getResourceAsStream方法所使用的资源路径的解释
这是个非常基础的问题了,这里提供一些演示样例,帮助高速理解和记忆这个问题. 在该方法的文档:http://docs.oracle.com/javase/7/docs/api/java/lang/Cla ...
- Class.getResourceAsStream()与ClassLoader.getResourceAsStream()获取资源时的路径说明
Class.getResourceAsStream(): com.xusweeter.iot.ws.vodafone.config.VodafoneServiceConfig.class.getRes ...
- class getResourceAsStream 和 classloader getResourceAsStream获取资源的不同
工程目录结构: prj(工程根目录) cn json classloader GetResourceByClassAndClassLoader.Java beans.xml /** * */ pack ...
- JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别
Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致. 例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest.c ...
- ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别
Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致. 例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest. ...
- classLoader.getResourceAsStream中文乱码
一直用一个方法安然无恙,今天在新项目中突然乱码了,原代码: ClassLoader classLoader = Thread.currentThread().getContextClassLoader ...
- 1、ClassLoader.getResourceAsStream() 与Class.getResourceAsStream()的区别
1.ClassLoader.getResourceAsStream() 与Class.getResourceAsStream()的区别 例如你写了一个MyTest类在包com.test.mycode ...
随机推荐
- [转] - 经典SQL语句大全
经典SQL语句大全 一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql serv ...
- Phaser提供了Button对象简单的实现一个按钮
Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如何用Phaser来制作一个前段时间很火爆的游戏:Flappy Bird,希 ...
- jedis操作
Jedis jedis = RedisUtil.getJedis(); try { // 向key-->name中放入了value-->minxr jedis.set("name ...
- Bootstrap页面布局1 - 下载BS(bootstrap简称)
1.bootstrap 官方网站:http://wrongwaycn.github.io/bootstrap/docs/index.html 2.如图: 3.下载后得到如下目录结构 bootstrap ...
- faker image
$faker->image http://placehold.it http://placekitten.com/g/200/300 带文字 https://placeholdit.imgix. ...
- java Reentrant Lock
//Listing 7-1. Achieving Synchronization in Terms of Reentrant Locks import java.util.concurrent.Exe ...
- Ubuntu apparmor何方神圣
AppArmor 是一款与SeLinux类似的安全框架/工具,其主要作用是控制应用程序的各种权限,例如对某个目录/文件的读/写,对网络端口的打开/读/写等等. 来之Novell网站的引用: AppAr ...
- Bluetooth HFP介绍
目录 1. 介绍 1.1 目的 1.2 使用场景 1.3 依赖关系 1.4 协议栈 1.5 角色 2. 应用层 3. 空白章节 4. 互操作性要求 4.1 介绍 4.2 Service Level C ...
- yaf性能测试(wamp环境)
1实现mvc 出现helloword,成功 2.controller重定向 $get = $this->getRequest()->getQuery("get", &q ...
- There is no tracking information for the current branch
There is no tracking information for the current branch. Please specify which branch you want to mer ...