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

转:http://cheneyph.iteye.com/blog/831721

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对象的这两个方法就可以了。

因此,直接调用 
this.getClass().getResourceAsStream(String name)

;获取流,静态化方法中则使用ClassLoader.getSystemResourceAsStream
(String name)

; 。

下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。

1.this.getClass().getResource("")

得到的是当前类class文件的URI目录。不包括自己!
如:file:/D:/workspace/jbpmtest3/bin/com/test/

2.this.getClass().getResource("/")

得到的是当前的classpath的绝对URI路径

如:file:/D:/workspace/jbpmtest3/bin/

3.this.getClass()

.getClassLoader().getResource("")

得到的也是当前ClassPath的绝对URI路径

如:file:/D:/workspace/jbpmtest3/bin/

4.ClassLoader.getSystemResource("")

得到的也是当前ClassPath的绝对URI路径

如:file:/D:/workspace/jbpmtest3/bin/

5.Thread.currentThread().getContextClassLoader

().getResource("")

得到的也是当前ClassPath的绝对URI路径

如:file:/D:/workspace/jbpmtest3/bin/

6.ServletActionContext.getServletContext().getRealPath(“/”)

Web应用程序
中,得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。
如:file:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/WebProject

注意点:

1.尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径。这是一颗定时炸 弹,随时可能要你的命。

2.尽量使用URI形式的绝对路径资源。它可以很容易的转变为URI,URL,File对象。

3.尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL
getExtendResource(String
relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。

4.绝对不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!

获得CLASSPATH之外路径的方法:
URL base = this.getClass().getResource(""); //先获得本类的所在位置,如/home/popeye/testjava/build/classes/net/

String path = new File(base.getFile(), "……/……/……/"+name).getCanonicalPath(); //就可以得到/home/popeye/testjava/name

另外,如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。

时间: 04-10

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

Python List count()方法-用于统计某个元素在列表中出现的次数

描述 count() 方法用于统计某个元素在列表中出现的次数. 语法 count()方法语法: list.count(obj) 参数 obj -- 列表中统计的对象. 返回值 返回元素在列表中出现的次数. 实例 以下实例展示了 count()函数的使用方法: #!/usr/bin/python aList = [123, 'xyz', 'zara', 'abc', 123]; print "Count for 123 : ", aList.count(123); print "

COMMENT方法 用于在生成的SQL语句中添加注释内容,

COMMENT方法 用于在生成的SQL语句中添加注释内容,例如: $this->comment('查询考试前十名分数') ->field('username,score') ->limit(10) ->order('score desc') ->select(); 复制代码 大理石平台知识 最终生成的SQL语句是: SELECT username,score FROM think_score ORDER BY score desc LIMIT 10 /* 查询考试前十名分数

登录用到了两种方法GET和POST方法 用reqeusts实现

这里需要补充的是,客户端不仅仅是一些简单的操作,它也是会处理一些运算,业务逻辑的处理等.也就是说,客户端也做着一些本该由服务器来做的一些事情 这个错误第一反应是是不是新的这个gateway节点有问题啊?但是想想这是不可能的,因为并不是所有请求都不可以,而且找了gateway部门的同事问了下,也不存在对请求单独处理的逻辑. 认证的同时要抓取页面表单的其他input标签的name和value.joomla的较为简单,网站一般不会明文传输用户名和密码,遇到这种情况需要分析引入的js文件,模拟加密算法.

service使用handler与Activity沟通的两种方法

通过之前的学习,我们知道了在主线程中声明一个handler实例并实现了消息的处理方法之后,我可以在子线程中用此实例向主线程发消息,在处理方法中获取消息并更新UI. 那么,如果我们想用handler在service中向activity文件传递消息呢?在这里提供了两种方法 方法一: 在想接收消息的Activity中,把handler实例声明为静态的公用的,即 public static Handler handler; 由于为公用静态的成员变量,那么就可以以 activityname.handler

UIImage加载图片的两种方法区别

Apple官方的文档为生成一个UIImage对象提供了两种方法加载图片: 1. imageNamed,其参数为图片的名字: 2. imageWithContentsOfFile,其参数也是图片文件的路径. 那么两种有什么区别吗? 肯定是有的.根据Apple的官方文档: imageNamed: 这 个方法用一个指定的名字在系统缓存中查找并返回一个图片对象如果它存在的话.如果缓存中没有找到相应的图片,这个方法从指定的文档中加载然后缓存并返回这 个对象.因此imageNamed的优点是当加载时会缓存图

python list排序的两种方法及实例讲解

对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排序 list.sort(func=None, key=None, reverse=False) Python实例: >>> list = [2,5,8,9,3] >>> list [2,5,8,9,3] >>> list.sort() >>> list [2, 3, 5, 8, 9] 方法2.用序列类型函数sorted(list)进行排

积跬步,聚小流------实例分析jquery开发插件两种方法的区别

1.简介 jquery为开发插件提供了两个方法: *  jquery.extend(object);   为jquery类本身添加新的方法 *  jquery.fn.extend(object);  用来为jquery对象添加新的方法 2.理论介绍 分析这两个方法,不同点就在于中间多了一个.fn,那么这个.fn又是什么意思呢? $.fn是指jquery的命名空间,加了fn的方法和属性,会对jquery的每一个实例有效. 换种说法来解释的话: jquery本身是一个类,有它的属性和方法,赤裸裸的"

遍历Map的两种方法

MAP集合遍历的两种方法 1.使用keyset()获得Map中的的key ,然后使用get方法获得这个key对应的value; 示例:Map<String,Integer> map = new HashMap<String,Integer>(); map.put("张三",15); map.put("李四",16); map.put("王五",17); Set ss = map.keyset(); Iterator<

QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)

QT中获取选中的radioButton的两种方法 QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioButton* pbtn = qobject_cast<QRadioButton*>(ui->BG->checkedButton()); 2 QString name = pbtn->objectName(); 3 if(!QString::compare(name, "rad