在 java 中,
System.getProperty("user.dir") 得到的是當(dāng)前工作路徑(對(duì)應(yīng)命令行命令就是 linux 下的 pwd 、 windows 下的 cd ),而
System.getProperty("user.home") 得到的是當(dāng)前用戶主目錄(對(duì)應(yīng)于 linux 下的 ~ 目錄、 windows 下的 document and settings\username );但如果你想得到所運(yùn)行的 java 程序所在的路徑,似乎并沒有什么簡單的方法。
比如說,有一個(gè) pathTest.jar 包放在 D:\zeal\webdev 下,這個(gè) jar 執(zhí)行的時(shí)候需要在當(dāng)前目錄下讀寫一個(gè) test.log 文件。如果不采用絕對(duì)路徑來讀寫 test.log 的話,不同的 jar 運(yùn)行方式會(huì)帶來不同的結(jié)果:
cd D:\zeal\webdev
java -jar pathTest.jar
( test.log 將生成在 D:\zeal\webdev 目錄下 )
cd E:\sun\jre\bin
java -jar D:\zeal\webdev\pathTest.jar
( test.lgo 將生成在 E:\sun\jre\bin 目錄下 )
這勢(shì)必造成潛在的運(yùn)行錯(cuò)誤。解決的方法是必須在程序中指定 test.log 文件的絕對(duì)路徑。從本意上來講,這里我們希望 test.log 與 pathTest.jar 位于相同的路徑之下。但顯然無論是 "user.dir" 還是 "user.home" 都不會(huì)返回正確的結(jié)果。
幸好, java 允許我們定位某個(gè) class 的 CodeSource , 通過 CodeSource 提供的 Location 信息就能夠找到相關(guān)的文件路徑。假設(shè) pathTest.jar 的 main class 是 pathTest ,通過
new pathTest().getClass().getProtectionDomain().getCodeSource().getLocation();
就可以得到 pathTest.jar 的完整路徑( file:/D:/zeal/webdev/pathTest.jar ),接下來怎么做就簡單了。當(dāng)然,實(shí)際應(yīng)用中一般我們會(huì)選擇把所有與jar相關(guān)的資源文件一起打包進(jìn)去,或者使用 "user.home" 這樣的固定位置來存放;除非在特殊情況下才會(huì)需要通過這個(gè)迂回的方式來獲取相關(guān)的路徑信息。
posted on 2009-12-25 10:09
Daniel 閱讀(1888)
評(píng)論(2) 編輯 收藏 所屬分類:
CoreJava