zoukankan      html  css  js  c++  java
  • 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();  
     url1=test6.class.getClassLoader().getResource("1.txt").getFile();  
     结果:/F:/CheckOut/workspacefuxi/Thread_1/bin/1.txt  
    String url=test6.class.getResource("").getFile();  
    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()是用来获取这个信息的

  • 相关阅读:
    数字视频基础(四) 分类: 生活百科 2014-07-01 11:19 388人阅读 评论(0) 收藏
    数字视频基础(三) 分类: 生活百科 2014-07-01 11:19 357人阅读 评论(0) 收藏
    数字视频基础(二) 分类: 生活百科 2014-07-01 11:18 398人阅读 评论(0) 收藏
    数字视频基础(一) 分类: 生活百科 2014-07-01 11:17 345人阅读 评论(0) 收藏
    PCI-X总线 分类: 浅谈PCI 2014-07-01 08:28 697人阅读 评论(2) 收藏
    Mfc Tips
    windows 桌面开发 (zz)
    备 忘
    编程坑爹的注意
    虚拟机安装后的基本操作
  • 原文地址:https://www.cnblogs.com/yaobolove/p/5453280.html
Copyright © 2011-2022 走看看