2011-02-07 114 views
0

我已經將所有的類文件和資源打包成一個jar文件,但執行時聲音文件不會播放。我的包結構爲:聲音不能在罐子裏玩

+project 
|_classes 
|_ _*.class 
|_resources 
|_ _ *.jpg,*.wav 

代碼:

AudioInputStream inputStream = AudioSystem.getAudioInputStream(kidsClassRoom.class.getResourceAsStream("../resources/"+file)); 

執行此線時得到一個null

回答

0

當你做getResourceAsStream,它不是相對於當前類,而是相對於檔案的根。即,首先嚐試刪除../

+0

刪除'../'仍然沒有工作! – sarath 2011-02-07 16:54:20

+0

嘗試右鍵單擊資源文件夾並選擇「構建路徑 - >用作源文件夾」。 (這只是爲了確保從eclipse啓動時可以通過類加載器訪問這些文件。) – aioobe 2011-02-07 16:58:37

+0

我現在沒有使用任何IDE :) – sarath 2011-02-07 16:59:32

1

創建名爲resources包如下所示 enter image description here

然後

AudioSystem.getAudioInputStream(kidsClassRoom.class.getResourceAsStream("resources/"+file)); 
2

另一種理論已經提出的那些。通常成功的getResource()調用依賴於調用的類加載器實例來定位它們。出於這個原因,我建議使用一個用戶定義對象的實例,從中調用getResource()。例如。

// Sanity check 
System.out.println("The value of 'file' is: " + file); 
// Presuming kidsClassRoom1 is an instance of kidsClassRoom 
AudioInputStream inputStream = AudioSystem. 
    getAudioInputStream(
     kidsClassRoom1. 
      getClass(). 
      getResourceAsStream("/resources/"+file)); 

您可能還會注意到片段使用資源的前綴「/」。與其他人所說的相反,我相信這意味着從資源路徑的「根源」,即運行時類路徑上的任何Jar中找到它。留下'/'或'../'會使類加載器在類中的子路徑中搜索資源。

當然 - 確保Wav結束於罐!將.jar複製/重命名爲.zip,然後雙擊它即可查看Windows上存檔內容的'快速&髒'方式。

1

這是我在罐子中播放循環聲音文件的功能,它對我來說工作正常。

看來,getResourceAsStream()不適用於罐子。然而,getResource()呢。

public synchronized void alarm() { 
    try { 
     crit = AudioSystem.getClip(); 
     AudioInputStream inputStream1 = AudioSystem.getAudioInputStream(this.getClass().getResource("critical.wav")); 
     crit.open(inputStream1); 
     crit.loop(Clip.LOOP_CONTINUOUSLY); 

    } catch (Exception e) { 
     System.err.println(e.getMessage()); 
     } 
} 
0

需要注意的重要一點是,在出口罐子的資源沒有被存儲爲文件(閱讀這個地方,有人更瞭解請輸入)。因此,最好先將資源作爲URL對象,然後將其傳遞給AudioInputStream對象。

URL url = YourClass.class.getResource(filename); 
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); 

如果資源位於子文件夾中,請記住將其添加到文件名路徑中。