快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

获取类的class文件的绝对路径


    在java中,常常要定位某些文件的位置,为了能让程序与物理位置无关,就要使用相对路径。但java中使用相对路径总会碰到一些很麻烦的问题,就是到底相对于哪个参照物的问题。因为我们平时使用相对路径总是相对当前工作目录而言的,但有时需求并非如此。比如,要在一个开发包中使用相对路径,却不知道开发包被其他程序调用时的所在路径,而且特殊是在web应用中,很难确定某个文件在整个应用中的相对路径。

    所以使用相对路径最好的办法就是让路径相对的参照物是我的开发包或我的应用本身的东西,最好的就是用我开发包中的类的class文件。只要知道了某个class文件的绝对路径,就可以以它为参照物,使用相对路径来定位其他任何文件了。

    为了实现这个想法,我写了这个Path类,这个类提供了两个静态公共方式,一个用来定位类的class文件的位置,另一个以某个类为参照物来定位一个相对路径。使用这两个方式,我们可以完全不必理会应用的当前工作路径,随心所欲的根据自己的位置来寻找任何文件。比如在编写某个功能性开发包时,就可以完全不用管调用这个开发包的应用的路径情况,而仅仅根据开发包本身的位置来定位文件,这样很好的实现了封装性,将文件的路径处理完全封闭在了开发包自身之内。

以下是Path类的源代码:

 * 创建日期 2004-11-22 * * 更改所生成文件模板为 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 */package mytools;

import java.io.File;import java.io.IOException;import java.net.MalformedURLException;import java.net.URL;import java.security.CodeSource;import java.security.ProtectionDomain;

/** * @author 由月 *  * 这个类提供了一些根据类的class文件位置来定位的方式。 */public class Path { /**  * 获取一个类的class文件所在的绝对路径。 这个类可以是JDK自身的类,也可以是用户自定义的类,或者是第三方开发包里的类。  * 只要是在本程序中可以被加载的类,都可以定位到它的class文件的绝对路径。  *   * @param cls  *            一个对象的Class属性  * @return 这个类的class文件位置的绝对路径。 假如没有这个类的定义,则返回null。  */ public static String getPathFromClass(Class cls) throws IOException {  String path = null;  if (cls == null) {   throw new NullPointerException();  }  URL url = getClassLocationURL(cls);  if (url != null) {   path = url.getPath();   if ("jar".equalsIgnoreCase(url.getProtocol())) {    try {     path = new URL(path).getPath();    } catch (MalformedURLException e) {    }    int location = path.indexOf("!/");    if (location != -1) {     path = path.substring(0, location);    }   }   File file = new File(path);   path = file.getCanonicalPath();  }  return path; }

 /**  * 这个方式可以通过与某个类的class文件的相对路径来获取文件或目录的绝对路径。 通常在程序中很难定位某个相对路径,特殊是在B/S应用中。  * 通过这个方式,我们可以根据我们程序自身的类文件的位置来定位某个相对路径。  * 比如:某个txt文件相对于程序的Test类文件的路径是../../resource/test.txt,  * 那么使用本方式Path.getFullPathRelateClass("../../resource/test.txt",Test.class)  * 得到的结果是txt文件的在系统中的绝对路径。  *   * @param relatedPath  *            相对路径  * @param cls  *            用来定位的类  * @return 相对路径所对应的绝对路径  * @throws IOException  *             因为本方式将查询文件系统,所以可能抛出IO非常  */ public static String getFullPathRelateClass(String relatedPath, Class cls)   throws IOException {  String path = null;  if (relatedPath == null) {   throw new NullPointerException();  }  String clsPath = getPathFromClass(cls);  File clsFile = new File(clsPath);  String tempPath = clsFile.getParent() + File.separator + relatedPath;  File file = new File(tempPath);  path = file.getCanonicalPath();  return path; }

 /**  * 获取类的class文件位置的URL。这个方式是本类最基础的方式,供其它方式调用。  */ private static URL getClassLocationURL(final Class cls) {  if (cls == null)   throw new IllegalArgumentException("null input: cls");  URL result = null;  final String clsAsResource = cls.getName().replace(\\\'.\\\', \\\'/\\\').concat(    ".class");  final ProtectionDomain pd = cls.getProtectionDomain();  // java.lang.Class contract does not specify  // if \\\'pd\\\' can ever be null;  // it is not the case for Sun\\\'s implementations,  // but guard against null  // just in case:  if (pd != null) {   final CodeSource cs = pd.getCodeSource();   // \\\'cs\\\' can be null depending on   // the classloader behavior:   if (cs != null)    result = cs.getLocation();

   if (result != null) {    // Convert a code source location into    // a full class file location    // for some common cases:    if ("file".equals(result.getProtocol())) {     try {      if (result.toExternalForm().endsWith(".jar")        || result.toExternalForm().endsWith(".zip"))       result = new URL("jar:".concat(         result.toExternalForm()).concat("!/")         .concat(clsAsResource));      else if (new File(result.getFile()).isDirectory())       result = new URL(result, clsAsResource);     } catch (MalformedURLException ignore) {     }    }   }  }

  if (result == null) {   // Try to find \\\'cls\\\' definition as a resource;   // this is not   // document.d to be legal, but Sun\\\'s   // implementations seem to //allow this:   final ClassLoader clsLoader = cls.getClassLoader();   result = clsLoader != null ? clsLoader.getResource(clsAsResource)     : ClassLoader.getSystemResource(clsAsResource);  }  return result; }

 public static void main(String[] args) {  try {   System.out.println(getPathFromClass(Path.class));   System.out.println(getFullPathRelateClass("../test/abc/..",     Path.class));  } catch (Exception e) {   e.printStackTrace();  } }}




返回类别: 教程
上一教程: JAVA相关基础知识(6)
下一教程: Java入门笔记3_Datastructure

您可以阅读与"获取类的class文件的绝对路径"相关的教程:
· java文件的相对路径
· 用Java程序获取绝对路径
· CLASS文件的存放位置
· JSP、SERVLET中的相对路径和绝对路径
· java中找到资源文件的路径
    微笑服务 优质保证 索取样品