擷取類的class檔案的絕對路徑

來源:互聯網
上載者:User

    在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();  } }}


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。