2010-09-29 101 views
1

我試圖讓我的應用程序透明地加載資源(二進制文件):打開文件;先嚐試文件系統,然後JAR

如果該文件存在於當前目錄下,請將其打開。
如果沒有,請嘗試查看當前的JAR文件(如果適用)。
如果不是,請嘗試查看其他JAR文件。 (這是可選的,我不介意明確指定該JAR文件)。

到目前爲止,我所知道的File打開一個本地文件和ClassLoader具有getResource*爲JAR內容。

是否有一個結合了兩者的課程?如果不是,我該怎麼去寫自己的?我應該寫一個ClassLoader這也檢查本地文件系統?使用File? (我很熟悉的Java,甚至不知道什麼是一個很好的類型返回。InputStream?)

感謝

附: 「文件」的意思是「路徑」,例如「數據/ texture1.png」。

回答

5

做#1和#3很容易。這樣做#2(只是希望只在當前JAR)是因爲它需要你搞清楚什麼JAR你

如果你想首先檢查文件系統,否則從classpath中加載,這將是像更難:

public java.io.InputStream loadByName(String name) { 
    java.io.File f = new java.io.File(name); 
    if (f.isFile()) { 
    return new FileInputStream(f); 
    } else { 
    return getClass().getResource(name); 
    } 
} 

如果您希望首先從同一個JAR文件加載,則需要確定它在哪裏。查看Determine which JAR file a class is from以獲取更多關於計算要從中加載資源的JAR文件的信息。

+0

我害怕我可能需要這樣的功能:( - 感謝指向另一個問題btw的指針。 – aib 2010-09-29 17:09:57

3

A URLClassLoader應該能夠加載並且如果文件路徑位於jar之前的類路徑上,則首先嚐試文件路徑。


關於你的評論:

+0

啊,太好了。這可能正是我要找的。 – aib 2010-09-29 17:09:27

+0

事實的確如此!但有一個問題:爲什麼我不能使用'new URL(「file:foo.jar!/ data」)?我似乎無法使用'!/'! – aib 2010-09-30 01:21:28

+0

Err和另外一件事,它似乎更喜歡JAR中的文件,而不管我給出路徑的順序。 – aib 2010-09-30 01:30:35

1

當前的jar文件和當前目錄不像JVM中的概念,就像它們在運行shell腳本時一樣。您將需要指定一個目錄將用於加載您感興趣的文件,如用在執行JVM的系統屬性:

java -Ddirectory.to.scan=/home/aib 

然後檢索該屬性:

String dir = System.getProperty("directory.to.scan"); 

現在談到JAR文件時,ClassLoader會加載啓動JVM時在類路徑上顯式指定的所有JAR文件。

InputStream is = <Your class>.class.getClassLoader().getResourceAsStream("binary file"); 

需要注意的是當前類加載器加載任何jar文件中搜索:您可以通過獲取特定類的類加載器。