轉自:http://blog.chinaunix.net/uid-20648927-id-1907273.html
對於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程序所在的路徑
具體代碼如下: 該方法既可以用於JAR或WAR文件,也可以用於非JAR文件。但要注意以下2點:
在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程序所在的路徑
具體代碼如下: 該方法既可以用於JAR或WAR文件,也可以用於非JAR文件。但要注意以下2點:
- 不要傳遞系統的類,作為getAppPath的參數,如java.lang.String.class,當然,也不要傳遞那些已經位於JDK中的那些類,比如xml相關的一些類等等。
- 要傳遞應該是程序中主要的運行類,不要傳遞程序中的支持類庫中的類文件,也就是那些第三方的類庫中的類文件,否則得到的將是那些類庫的位置。
