2009-07-13 76 views
11

此問題一直在困擾着我。我在我的Java應用程序加載一些文件,到目前爲止,我得到了工作的唯一方法是這樣的:使用ClassLoader加載文件

URL hsURL; 
if(System.getProperty("os.name").toLowerCase().contains("windows")) { 
    hsURL = new URL("file:/" + System.getProperty("user.dir") + "/helpsets/helpset.hs"); 
} 
else { 
    hsURL = new URL("file://" + System.getProperty("user.dir") + "/helpsets/helpset.hs"); 
} 

但這是醜陋和可怕的。有一段時間,我想我有這個工作:

hsURL = ClassLoader.getSystemResource("helpsets/helpset.hs"); 

但不再適用於某種原因(我必須改變的東西,沒有注意到它返回null

我應該使用的getResource()。而不是getSystemResource()(如果是這樣,爲什麼是getSystemResource()靜態,但不是getResource())?

我使用eclipse,我試過包括文件夾中的構建路徑(classpath)似乎沒有區別

回答

23

getSystemResource是靜態的,因爲它將使用系統類加載器,它是靜態可用的。 (ClassLoader.getSystemClassLoader

如果您的資源在類路徑中可用,我建議您使用適當類的ClassLoader.getResource()Class.getResource,例如,

Foo.class.getResource("/helpsets/helpset.hs"); 

ClassLoader.getResource是「絕對」,除非你用「/」前綴它Class.getResource是相對於包中的類)

如果這不起作用,請發表您如何應用是根據類路徑和文件的位置來配置的。

編輯:我通常發現URL比InputStream有用,所以我用getResourceAsStream而不是getResource。 YMMV

+0

該死。打敗我幾秒鐘 – tddmonkey 2009-07-13 14:29:57

3

你在這裏提到了幾個不同的東西,所以讓我們把它們整理出來。

1)創建一個「文件:」 URL基於「user.dir來」

了「user.dir來」屬性指的是當前工作目錄 - 無論當他/她開始用戶可能已經應用程序。很有可能寫在這裏的文件在兩次運行之間會消失(因爲用戶可能從不同的目錄運行)。

「user.home」屬性是指用戶的主目錄 - 運行時應保持相同。

在任何一種情況下,都可以使用File對象來打開文件,不要隨意創建「file:」URL。你沒有得到任何好處,正如你所看到的,你必須編寫混亂的代碼才能訪問它。

2)通過類加載器

這意味着可以檢索應用程序附帶的文件檢索資源 - 只讀文件。正如你所看到的,有多種變體。我更喜歡使用以下內容,因爲我認爲一個類將要加載與其打包在一起的文件。

InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName); 
相關問題