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

就目前的我来说最常用的两种获取路径的方法是 

       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()是用来获取这个信息的




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值