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 ...
随机推荐
- Marching Cube
GPU-Marching-Cubes An Implementation of the Marching Cubes[1] Algorithm Marching Cubes Matlab The St ...
- 从prompt输入10个人的年龄放入数组,将十个人的年龄求总和。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- for循环下九九乘法表
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- System.getProperty
我们可以通过System.getProperty("user.home")读取JAVA系统的user.home属性的值.
- 记sql语句空格带来的问题
在做分页的时候,引用了一个分页类.在一条sql语句出发生错误,没查出数据,代码如下 $sql="select * from sw_goods".$page->limit; 正 ...
- android之发送短信程序
首先改写activity_main.xml文件 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/re ...
- android之数据库SQLite(一)
创建数据库 首先定义SQLiteOpenHelper的子类 代码如下: package com.example.myandroid; import android.content.Context; i ...
- 最基本的session保存法,类似于默认的files方法
关于session的几个补充函数 在PHP下,关于session的讨论很多,其实在PHP4中还有几个函数是我们平时没有注意到的. 下面我把它们介绍给大家吧. 其中的session_set_save_h ...
- 5.PHP内核探索:多进程/线程的SAPI生命周期
多进程的SAPI生命周期 通常PHP是编译为apache的一个模块来处理PHP请求.Apache一般会采用多进程模式, Apache启动后会fork出多个子进程,每个进程的内存空间独立,每个子进程都会 ...
- Oracle用户、权限、角色管理(转)
http://blog.csdn.net/junmail/article/details/4381287 Oracle 权限设置一.权限分类:系统权限:系统规定用户使用数据库的权限.(系统权限是对用户 ...