----------------------------------------------------原文--------------------------------------------------------------------
寫作業的時候要輸出一個record.dat文件到jar包的同級目錄,但是不知道怎麼定位jar包的路徑。百度到的方法不很靠譜,所以在這裏記錄一下。
一:使用類路徑
1 String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
或者
1 String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
因爲程序已經被打包成jar包,所以getPath()和getFile()在這裏的返回值是一樣的。都是/xxx/xxx.jar這種形式。如果路徑包含Unicode字符,還需要將路徑轉碼
path = java.net.URLDecoder.decode(path, "UTF-8");
二:使用JVM
String path = System.getProperty("java.class.path");
利用了java運行時的系統屬性來得到jar文件位置,也是/xxx/xxx.jar這種形式。
這樣,我們就獲得了jar包的位置,但是這還不夠,我們需要的是jar包的目錄。
使用
1 int firstIndex = path.lastIndexOf(System.getProperty("path.separator")) + 1; 2 int lastIndex = path.lastIndexOf(File.separator) + 1; 3 path = path.substring(firstIndex, lastIndex);
來得到目錄。
path.separator在Windows系統下得到;(分號),在Linux下得到:(冒號)。也就是環境變量中常用來分割路徑的兩個符號,比如在Windows下我們經常設置環境變量PATH=xxxx\xxx;xxx\xxx;這裏獲得的就是這個分號。
File.separator則是/(斜槓)與\(反斜槓),Windows下是\(反斜槓),Linux下是/(斜槓)。
如何加載jar包中的資源。
1. 比如說我要得到背景圖片,源代碼中它是
/src/UI/image/background.jpg
那麼在jar包中它的路徑應該是
/UI/image/background.jpg
路徑最前面的/表示根目錄,即絕對路徑,若沒有最左邊的/,則表示相對路徑。使用哪種方法看自己的需求,這裏使用了絕對路徑。
加載的時候使用
1 java.net.URL fileURL = this.getClass().getResource("/UI/image/background.jpg"); 2 javax.swing.Image backGround = new ImageIcon(fileURL).getImage();
即可以獲得該圖片資源。
2. 有時候,我們需要加載文本資源或音樂資源,而文本在Java中是以流對象存在的,這時我們就要使用
InputStream in = this.getClass().getResourceAsStream("/UI/image/background.txt");
加載該資源。
PS:注意這裏兩種方法的區別,第一種是先得到該文件的路徑,再加載該文件資源。第二種則是直接加載該對象。
3.有時候,我們有一些資源類,其中的資源對象都是pulic static final修飾的,這裏可以採用這樣的方法初始化。
比如說我有一個ImageSource類用來加載各種圖片資源,那麼可以如下使用
1 public class ImageSource 2 { 3 static 4 { 5 URL fileURL = ImageSource.class.getResource(“/UI/image/background.jpg”); 6 BACK_GROUND = new ImageIcon(fileURL).getImage(); 7 } 8 public static final Image BACK_GROUND; 9 }
這裏不能用構造函數初始化,因爲構造函數和對象相關,而static變量和對象是無關的,只和類相關。在Java的語法中,類中的static塊是不依賴類對象的,因此可以初始化statc對象。同時,static塊中不能使用this,這裏使用了ImageSource.class代替。
--------------------------------------------------------原文分割線------------------------------------------------------------
今天寫java代碼的時候,要實現一個功能:要求代碼生成的jar包可以調用一個shell腳本,目錄結構如下:
model
T2dswmm.jar
runmodel.sh
對,就是在T2dswmm.jar中調用統計目錄下的shell腳本;
代碼如下:
File curProjectFile= null;
try {
//先用上邊文章中的方法獲取jar包中主類T2dswmm.class所在位置,即model/T2dswmm.jar/,jar包也算路徑的一部分
curProjectFile = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
} catch (Exception e) {
e.printStackTrace();
}
//獲取jar包的上級目錄,即model/
String curProjectParent=curProjectFile.getParent();
//獲取runmodel.sh
String shellPath=curProjectParent+"/runmodel.sh";
成功獲取到shell的位置。