2009-12-14 247 views
19

我有一個項目A,它包含一些java文件和一個類路徑資源R.txt。在項目中,我使用ClassLoader.getSystemResource(「R.txt」);檢索R.txt。jar中的類路徑資源

然後我有一個項目B,其中包括項目A的jar文件。現在getSystemResource(「R.txt」)不會找到文本文件(是的,它仍然在jar文件的根目錄中)。即使嘗試在其他網站上建議的「/R.txt」也無效。有任何想法嗎?

回答

42

使用getResource而不是getSystemResource來使用特定於給定類加載器的資源而不是系統。調用Class.getResource代替ClassLoader.getResource

URL resource = getClass().getClassLoader().getResource("R.txt"); 
URL resource = Foo.class.getClassLoader().getResource("R.txt"); 
URL resource = getClass().getResource("/R.txt"); 
URL resource = Foo.class.getResource("/R.txt"); 

注意的斜線;:例如,嘗試以下任一Class.getResource是相對於包含該類的包,除非您有一個前導斜槓,而ClassLoader.getResource始終是絕對的。

+0

令人驚歎。這完全解決了我的問題。感謝您的超快速輸入 // Johan – 2009-12-14 10:58:11

+0

還有一個相關問題:我們可能從這個URL資源中獲取InputStream,但是我們怎麼才能從返回的URL對象中創建一個** File **對象。我試圖用「URLObject.toURI()」創建一個** URI **對象,並且使用這個URI對象來創建一個文件,不幸的是,它會拋出一個「URI不是等級異常」。你能給我一些幫助嗎?非常感謝 。 – 2012-08-11 21:39:15

+2

@EnsomHodder:恩,不知道 - 但不是所有的資源*都是*文件 - 尤其是,如果它在一個jar文件中,它不會。 – 2012-08-11 22:25:17

5

顯然你的JAR沒有被系統加載器加載,所以getSystemResource()不能工作。這應該工作:

ClassFromProjectA.class.getClassLoader().getResource("R.txt") 

IMO更方便是把同一個包內資源使用它們的類,這樣你就可以使用更短的

ClassFromProjectA.class.getResource("R.txt") 

(或者,該類裏面只是getClass().getResource("R.txt")

2

ClassLoader.getResource()是否工作?目前,您只是指定要使用系統類加載器。

+0

工程就像一個魅力。只需要使用正確的類加載器:) – 2009-12-14 11:05:16