您的位置:首页 > 编程语言 > Java开发

Java中获取路径的方法_自我分析

2016-05-02 21:48 411 查看
就目前的我来说最常用的两种获取路径的方法是 

       class.getRecource(filename) class.getclassloader.getRecource(filename)

       这两者的区别其实很简单就是路径的时候有点不同,这里主要讲两个参数,其他的路径获取,其他的话在根据相对路径逐一查找就行了

class.getRecource(filename):

参数"/"表示获取根目录; (即我们常用到的bin目录【字节码文件存放的目录】
" " 表示获取当前类路径
class.getclassloader.getRecourc(filename):

参数“/” 是null值得,因为底层是c++写的
“ “便是获取根目录(即bin目录)
     好了,具体怎么来实现,

通过一个例子来了解吧



      对于这个bin目录下的1.txt怎么获取呢

String url=test6.class.getResource("/1.txt").getFile();
String url1=test6.class.getClassLoader().getResource("1.txt").getFile();
结果:/F:/CheckOut/workspacefuxi/Thread_1/bin/1.txt


String url=test6.class.getResource("").getFile();
结果:/F:/CheckOut/workspacefuxi/Thread_1/bin/Test1/
     

        

        那为什么会出现这种情况呢?

那我们来分析一下他的源码,这是class.getRecource()的源码:

public java.net.URL getResource(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResource(name);
}
return cl.getResource(name);
}
这里就可以很明确的看到最终他还是要执行cl.getResource(name),等于就是执行了class.getClassLoader().getRecource()方法

所以来说这两者实际上是一致的

来为什么在获取路径上的时候出现了分歧呢,来让我来在看一下resolveName(name)的源码

private String resolveName(String name) {
if (name == null) {
return name;
}
if (!name.startsWith("/")) {
Class c = this;
while (c.isArray()) {
c = c.getComponentType();
}
String baseName = c.getName();
int index = baseName.lastIndexOf('.');
if (index != -1) {
name = baseName.substring(0, index).replace('.', '/')
+"/"+name;
}
} else { //这里就可以很清楚知道有'/'时候会把它去掉
name = name.substring(1);
}
return name;
}


   这样就可以很明确理解两者为何会是这样的情况了

 

    最后呢我还想说说getclassLoader()的作用:

这是网上的一段比较好的解释:

   Java是面向对象语言,面向对象的语言的宗旨就是万事万物皆对象,那么类也是一个对象,类里面的属性和方法也是对象。java里面的所

有的类都是Class类的对象,这个this.class是获得这个类相对于Class类的对象。后面的方法是获得这个类对象的加载器。

只有Class类才有getClassLoader()方法呀~ 可以这么想,我们平时讲述某某类,但是我们并没有说这个类怎么和虚拟机打交道,虚拟机怎么识别这

个类.总不能全靠字符串吧. 所以呢java就设计了Class这个类.用于虚拟机对类的管理.当一个类被虚拟机装载完毕的时候,就会创建一个Class类

的实例,对于类A就是A.class,对于类B就是B.class. Class类也提供了许多方法来获取类的信息. 要知道,类的装载器分为 "启动类装载器 ", "用

户定义装载器 ".它不止一种 Class类需要保存这些信息. getClassLoader()是用来获取这个信息的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: