情景:本人在Windows下寫了一個Java程序,該程序需要從當前目錄下的一個.xml文件中讀取參數。
問題在於現需把該程序打包成.jar包部署到Linux下,那麼如何在Linux下定位當前目錄呢?
參考網上的一些方法得知可以通過
String path = Class.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
來解決
請看兩組實驗:
程序代碼如下:
package test;
public class T {
public static String path;
public static void main(String[] args) {
path = new T().getPath();
System.out.println(path);
}
public String getPath() {
String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
return path;
}
首先在windows下分別對.class和.jar文件進行測試(當前目錄爲G:/):
.class文件輸出爲:
/G:/
.jar文件輸出爲:
/G:/Test.jar
然後在Linux下分別對.class和.jar文件進行測試(當前目錄爲/usr/):
.class文件輸出爲:
/usr/
.jar文件輸出爲:
/usr/Test.jar
所以得出結論,對於.class文件或者在編譯器中我們只需要去除最前面的'/'即可。而對於.jar而言,我們需要去除最前面的'/'和後面的jar包名.jar兩部分纔行。且爲了保證在編譯器中能夠進行測試那麼我們可以這樣來寫:
package test;
public class T {
public static String path;
public static void main(String[] args) {
path = new T().getPath();
}
public String getPath() {
String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
System.out.println(path);
if (System.getProperty("os.name").contains("dows")) {//判斷操作系統
try {
path = java.net.URLDecoder.decode(path, "UTF-8");//防止Windows下中文目錄亂碼
} catch (Exception e) {
e.printStackTrace();
}
path = path.substring(1, path.length());//去除前'/'
}
if (path.contains("jar")) {//去除jar包名.jar
path = path.substring(0, path.lastIndexOf("."));
return path.substring(0, path.lastIndexOf("/"));
}
return path;
}
}