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

  • 相关阅读:
    Java核心技术 卷一 笔记四 库类的直接使用
    Java核心技术 卷一 笔记三 大数值及数组
    Java核心技术 卷一 笔记2 字符串的复制
    Java核心技术 卷一 笔记1
    修改css 样式后, hover事件 不生效
    修改 element ui input 输入框 样式不生效问题
    css3 计算属性
    Vue3 改动系列
    浏览器实现,向下滑动 鼠标滚轮,页面横向移动
    linux ceont0s7 vue 打包压缩图片 一直报错
  • 原文地址:https://www.cnblogs.com/yaobolove/p/5453280.html
Copyright © 2011-2022 走看看