寫(xiě)作業(yè)的時(shí)候要輸出一個(gè)record.dat文件到j(luò)ar包的同級(jí)目錄,但是不知道怎么定位jar包的路徑。百度到的方法不很靠譜,所以在這里記錄一下。
一:使用類(lèi)路徑
1 String path = this.getClass().getPRotectionDomain().getCodeSource().getLocation().getPath();
或者
1 String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
因?yàn)槌绦蛞呀?jīng)被打包成jar包,所以getPath()和getFile()在這里的返回值是一樣的。都是/xxx/xxx.jar這種形式。如果路徑包含Unicode字符,還需要將路徑轉(zhuǎn)碼
path = java.net.URLDecoder.decode(path, "UTF-8");
二:使用JVM
String path = System.getProperty("java.class.path");
利用了java運(yùn)行時(shí)的系統(tǒng)屬性來(lái)得到j(luò)ar文件位置,也是/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);
來(lái)得到目錄。
path.separator在Windows系統(tǒng)下得到;(分號(hào)),在linux下得到:(冒號(hào))。也就是環(huán)境變量中常用來(lái)分割路徑的兩個(gè)符號(hào),比如在Windows下我們經(jīng)常設(shè)置環(huán)境變量PATH=xxxx/xxx;xxx/xxx;這里獲得的就是這個(gè)分號(hào)。
File.separator則是/(斜杠)與/(反斜杠),Windows下是/(反斜杠),Linux下是/(斜杠)。
如何加載jar包中的資源。
1. 比如說(shuō)我要得到背景圖片,源代碼中它是
/src/UI/image/background.jpg
那么在jar包中它的路徑應(yīng)該是
/UI/image/background.jpg
路徑最前面的/表示根目錄,即絕對(duì)路徑,若沒(méi)有最左邊的/,則表示相對(duì)路徑。使用哪種方法看自己的需求,這里使用了絕對(duì)路徑。
加載的時(shí)候使用
1 java.net.URL fileURL = this.getClass().getResource("/UI/image/background.jpg");2 javax.swing.Image backGround = new ImageIcon(fileURL).getImage();
即可以獲得該圖片資源。
2. 有時(shí)候,我們需要加載文本資源或音樂(lè)資源,而文本在Java中是以流對(duì)象存在的,這時(shí)我們就要使用
InputStream in = this.getClass().getResourceAsStream("/UI/image/background.txt");
加載該資源。
PS:注意這里兩種方法的區(qū)別,第一種是先得到該文件的路徑,再加載該文件資源。第二種則是直接加載該對(duì)象。
3.有時(shí)候,我們有一些資源類(lèi),其中的資源對(duì)象都是pulic static final修飾的,這里可以采用這樣的方法初始化。
比如說(shuō)我有一個(gè)ImageSource類(lèi)用來(lái)加載各種圖片資源,那么可以如下使用
1 public class ImageSource2 {3 static4 {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 }
這里不能用構(gòu)造函數(shù)初始化,因?yàn)闃?gòu)造函數(shù)和對(duì)象相關(guān),而static變量和對(duì)象是無(wú)關(guān)的,只和類(lèi)相關(guān)。在Java的語(yǔ)法中,類(lèi)中的static塊是不依賴(lài)類(lèi)對(duì)象的,因此可以初始化statc對(duì)象。同時(shí),static塊中不能使用this,這里使用了ImageSource.class代替。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注