获取Java程序运行的路径

网上很多人介绍了各种获取的方法,但是获取都不大好,一大番处理.我摘录了一个非常好的例子
,不过我找到了一个更加好的方法..
 
System.getProperty("java.class.path")//这个方法可以获取当前运行程序的完整路径,绝对的路径,并且适应操作系统,无需处理,更加high的是,,哪怕你把jar文件弄成了exe文件,,都可以获取哦,相信非常多的人需要.
System.getProperty("usr.dir")//获取当前运行程序的完整目录,配合上面那个使用,相信问题都没了.
 
------------以下是摘自别人的----------------
对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢?

在Java处理的文件系统中,目录的表示方式有两种:

(1)绝对目录,它以"/"为起始字符,代表从根目录下开始寻找给出的目录,如/c:/java

(2)相对路径,它以不带“/”的目录名表示,表示以当前Java程序正在运行的目录作为起始目录来寻找给出的目录。如java/classes。在相对路径中,有一些特定的字符,可以代表特的的目录,比如,“.”代表当前目录,“..”代表当前目录的上一级目录。在网上很多给出的例子中,就是利用"."作为目录名,构造File对象的实例,然后通过File对象的方法来获取当前程序运行的目录。

    这种方法虽然简单,但有时不能正确的得出当前程序的运行目录。原因在于,运行Java程序不一定要进入到该程序的类文件或JAR文件所在的目录,只要在运行时指定了正确的类路径信息,就可以在任何目录中运行Java程序,此时利用这种方法只能得到发出运行命令时所在的目录信息。

     从上面的分析可以看出,对于很多Java程序,尤其是WEB程序,利用当前路径的“.”表示法,都不能满足要求。那么怎样才能正确的得到运行目录信息呢?

     在Web程序中,利用Servlet API可以获得一些路径信息,比如HttpServletRequest接口中定义的getRealPath方法,但类似这些方法都依赖于Servlet环境,不便于程序的单元测试。

    本文提供了一种只使用Java标准API的路径探测方法,就是利用ClassLoader抽象类。

    利用java.lang.Class的getClassLoader方法,可以获得给定类的ClassLoader实例,它的getResource方法可以获得当前类装载器中的资源的位置,我们可以利用类文件的名称作为要查找的资源,经过处理后就可获得当前Java程序的运行位置信息,其伪代码如下:
   
    获得Class参数的所在的类名
    取得该类所在的包名
    将包名转换为路径
    利用getResource得到当前的类文件所在URL
    利用URL解析出当前Java程序所在的路径
 
   具体代码如下:
        
     /**-----------------------------------------------------------------------
     *getAppPath需要一个当前程序使用的Java类的class属性参数,它可以返回打包过的
     *Java可执行文件(jar,war)所处的系统目录名或非打包Java程序所处的目录
     *@param cls为Class类型
     *@return 返回值为该类所在的Java程序运行的目录
     -------------------------------------------------------------------------*/

     public static String getAppPath(Class cls){
         //检查用户传入的参数是否为空
         if(cls ==null) 
          throw new java.lang.IllegalArgumentException( "参数不能为空!");
        ClassLoader loader =cls.getClassLoader();
         //获得类的全名,包括包名
        String clsName =cls.getName() + ".class";
         //获得传入参数所在的包
        Package pack =cls.getPackage();
        String path = "";
         //如果不是匿名包,将包名转化为路径
         if(pack !=null){
            String packName =pack.getName();
            //此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库
            if(packName.startsWith( "java.") ||packName.startsWith( "javax.")) 
               throw new java.lang.IllegalArgumentException( "不要传送系统类!");
             //在类的名称中,去掉包名的部分,获得类的文件名
            clsName =clsName.substring(packName.length() + 1);
             //判定包名是否是简单包名,如果是,则直接将包名转换为路径,
             if(packName.indexOf( ".") < 0) path =packName + "/";
             else{ //否则按照包名的组成部分,将包名转换为路径
                 int start = 0,end = 0;
                end =packName.indexOf( ".");
                 while(end != - 1){
                    path =path +packName.substring(start,end) + "/";
                    start =end + 1;
                    end =packName.indexOf( ".",start);
                }
                path =path +packName.substring(start) + "/";
            }
        }
         //调用ClassLoader的getResource方法,传入包含路径信息的类文件名
        java.net.URL url =loader.getResource(path +clsName);
         //从URL对象中获取路径信息
        String realPath =url.getPath();
         //去掉路径信息中的协议名"file:"
         int pos =realPath.indexOf( "file:");
         if(pos > - 1) realPath =realPath.substring(pos + 5);
         //去掉路径信息最后包含类文件信息的部分,得到类所在的路径
        pos =realPath.indexOf(path +clsName);
        realPath =realPath.substring( 0,pos - 1);
         //如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名
         if(realPath.endsWith( "!"))
            realPath =realPath.substring( 0,realPath.lastIndexOf( "/"));
       /*------------------------------------------------------------
       ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径
        中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要
        的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的
        中文及空格路径
      -------------------------------------------------------------*/

       try{
        realPath =java.net.URLDecoder.decode(realPath, "utf-8");
       } catch(Exception e){ throw new RuntimeException(e);}
        return realPath;
    } //getAppPath定义结束
    //-----------------------------------------------------------------
该方法既可以用于JAR或WAR文件,也可以用于非JAR文件。但要注意以下2点:
  1. 不要传递系统的类,作为getAppPath的参数,如java.lang.String.class,当然,也不要传递那些已经位于JDK中的那些类,比如xml相关的一些类等等。
  2. 要传递应该是程序中主要的运行类,不要传递程序中的支持类库中的类文件,也就是那些第三方的类库中的类文件,否则得到的将是那些类库的位置。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值