於 .jar 檔中讀取檔案。
最近碰到於 jar 檔中讀資料的問題,來自網路的說明為
在 Eclipse 開發時的目錄結構:
Test
|--src
|--test
|--FileInJar .java
|--files
|--file.txt
|--bin
|--test
|--FileInJar.class
|--files
|--file.txt
對於下面寫法,欲取得所對應的實際路徑:
String path1 = "../files/file.txt";
String path2 = "./files/file.txt";
String path3 = "/files/file.txt";
String path4 = "files/file.txt";
上述4個路徑的實際路徑分別為:
path1=[Jar_Root]/files/file.txt
path2=[Jar_Root]/test/files/file.txt
path3=[Jar_Root]/files/file.txt
path4=[Jar_Root]/test/files/file.txt
即資源的路徑(name)有兩種格式:[1]以'/'開頭的,此路徑將相對於jar的根目錄;[2]不以'/'開頭,此路徑將相對於該class檔在jar中的位置。
若進行以下測試
InputStream in1 = path.getClass().getResourceAsStream(path1); // not null
InputStream in2 = path.getClass().getResourceAsStream(path2); // null
InputStream in3 = path.getClass().getResourceAsStream(path3); // not null
InputStream in4 = path.getClass().getResourceAsStream(path4); // null
InputStream in5 = path.getClass().getClassLoader().getResourceAsStream(path1); // null
InputStream in6 = path.getClass().getClassLoader().getResourceAsStream(path2); // not null
InputStream in7 = path.getClass().getClassLoader().getResourceAsStream(path3); // null
InputStream in8 = path.getClass().getClassLoader().getResourceAsStream(path4); // not null
為什麼使用ClassLoader方法與Class中的相應方法,結果不相同?
其實Class中的該方法是ClassLoader中該方法的代理方法,即Class也是調用ClassLoader中的 getResourceAsStream(String name)去完成任務。但Class會首先對name的值進行處理(這個處理其實就是前面描述的路徑演算法),而ClassLoader不會。這應該就是 Class和ClassLoader在對待資源路徑時的分歧了。
在 Eclipse 開發時的目錄結構:
Test
|--src
|--test
|--FileInJar .java
|--files
|--file.txt
|--bin
|--test
|--FileInJar.class
|--files
|--file.txt
對於下面寫法,欲取得所對應的實際路徑:
String path1 = "../files/file.txt";
String path2 = "./files/file.txt";
String path3 = "/files/file.txt";
String path4 = "files/file.txt";
上述4個路徑的實際路徑分別為:
path1=[Jar_Root]/files/file.txt
path2=[Jar_Root]/test/files/file.txt
path3=[Jar_Root]/files/file.txt
path4=[Jar_Root]/test/files/file.txt
即資源的路徑(name)有兩種格式:[1]以'/'開頭的,此路徑將相對於jar的根目錄;[2]不以'/'開頭,此路徑將相對於該class檔在jar中的位置。
若進行以下測試
InputStream in1 = path.getClass().getResourceAsStream(path1); // not null
InputStream in2 = path.getClass().getResourceAsStream(path2); // null
InputStream in3 = path.getClass().getResourceAsStream(path3); // not null
InputStream in4 = path.getClass().getResourceAsStream(path4); // null
InputStream in5 = path.getClass().getClassLoader().getResourceAsStream(path1); // null
InputStream in6 = path.getClass().getClassLoader().getResourceAsStream(path2); // not null
InputStream in7 = path.getClass().getClassLoader().getResourceAsStream(path3); // null
InputStream in8 = path.getClass().getClassLoader().getResourceAsStream(path4); // not null
為什麼使用ClassLoader方法與Class中的相應方法,結果不相同?
其實Class中的該方法是ClassLoader中該方法的代理方法,即Class也是調用ClassLoader中的 getResourceAsStream(String name)去完成任務。但Class會首先對name的值進行處理(這個處理其實就是前面描述的路徑演算法),而ClassLoader不會。這應該就是 Class和ClassLoader在對待資源路徑時的分歧了。
0 Comments:
Post a Comment
<< Home