码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-05-02 23:07:20      阅读:610      评论:0      收藏:0      [点我收藏+]

标签:

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

       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中获取路径的方法_自我分析

标签:

原文地址:http://www.cnblogs.com/yaobolove/p/5453280.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!