Java如何獲取當前的jar包路徑以及如何讀取jar包中的資源

原文鏈接

----------------------------------------------------原文-------------------------------------------------------------------- 

寫作業的時候要輸出一個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的位置。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章