2011-06-19 34 views
4

這個問題在很多地方都有問到,有很多小變化。 (如Java - getClassLoader().getResource() driving me bonkers等)。我仍然無法使它工作。
這裏有一個代碼片段:
我應該如何在Java中使用getResource()?

 String clipName = "Chook.wav"; 
     ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
     // URL url = classLoader.getResource(clipName); 
     URL url = new URL("file:///Users/chap/Documents/workspace/the1620/bin/ibm1620/" + clipName); 
     ais = AudioSystem.getAudioInputStream(url); 

這工作 - 請注意,我硬編碼的路徑,包含剪輯文件,該文件是的目錄,是在同一個目錄作爲我的.class文件。唉,註釋掉的代碼只會爲url返回一個空值。

大多數其他帖子似乎處理getResourceAsStream()。我想我應該使用getResource()。是做出了區別?

它只是不能是這個難。任何線索?

+1

'clipName'的價值是什麼? –

+0

更新的原點。帖子。 (「Chook.wav」) – Chap

回答

4
String clipName = "Chook.wav"; 

當使用getResource時,您傳入的字符串必須是絕對名稱或相對於某個類的有效性。由於您使用的是ClassLoader.getResource()而不是Class.getResource(),因此它必須是絕對路徑。

沒有看到您的實際文件層次結構,我只能猜測「bin」是您編譯的類和資源的根目錄,「ibm1260」是該路徑中的包/文件夾,「Chook.wav」存在於該文件夾。如果是這種情況,那麼您需要使用/ibm1260/Chook.wav(或潛在ibm1260/Chook.wav,我通常不使用類加載器進行資源查找)作爲傳遞到getResource()的文件的名稱。

無論哪種方式,您都需要確保文件被複制到編譯代碼的位置,並且根文件夾位於類路徑中。

+0

bin /是根(它是Eclipse創建的默認目錄)。 bin/ibm1620 /是包含* .class文件的目錄,正如您正確猜測的那樣。 bin/ibm1620/Chook.wav是資源。 Eclipse將其複製到該位置。 我拿起了「classloader」。getResource()「來自SO中的其他帖子的爵士樂,這顯然不是我應該使用的,你能爲我補充一下如何使用Class.getResource()嗎? – Chap

+0

@Chap:應該沒問題。使用'/ ibm1260/Chook.wav'的結果是什麼?請注意,當我說「它需要一個絕對路徑」時,我的意思是需要完全限定,就像'Integer'的完全限定路徑.class'將是'/ java/lang/Integer.class'。 –

+0

在進一步閱讀中,似乎'ibm1260/Chook.wav'是你想要的絕對資源名稱。 –

4

getResourcegetResourceAsStream方法用於訪問類路徑上的資源。你似乎試圖訪問一些不在類路徑上的資源。

getResourcegetResourceAsStream用來定位資源的邏輯基本上是相同的。這兩種方法之間的區別是一個返回一個URL,另一個是InputStream


它只是不能這麼難。任何線索?

這並不難。您只需瞭解類路徑如何工作......並確保您使用的資源名稱解析爲已放入類路徑中某個目錄或JAR文件中正確位置的資源。

或者,如果資源不是您的應用程序的「一部分」,請勿以此方式訪問它。

+0

那麼,根據Eclipse設置,類路徑是「the1620」。我的資源和我的班級文件全部位於/ Users/chap/Documents/workspace/the1620/bin/ibm1620 /中。那麼,他們是否在類路徑上? – Chap

+0

類路徑是「the1620」。 ClassLoader似乎在看「1620/bin」。我的.class文件和資源文件位於「the1620/bin/ibm1620」中。它可能不是「硬」,但它肯定會讓人困惑! ;-) – Chap

+0

在這種情況下,您應該調用getResource(「/ ibm1620/Chook.wav」)。 –

相關問題