2012-12-27 60 views
0

我正在嘗試使用我剛發現(JLayer)的整齊庫來播放mp3文件,並且在編譯時(在Netbeans中)使用此代碼可以正常工作:文件輸入流在編譯器中正常工作,但在編譯後無法工作

ClassLoader cl = this.getClass().getClassLoader(); 
url = cl.getResource("music/45.mp3"); 
pin = new FileInputStream(url.getFile()); 
p = new Player(pin); 
p.play(); 

我建立了我的項目,並試圖運行可執行jar。我擴展了JFrame,以便可以直觀地看到我的程序正在運行。框架在執行時出現,但沒有聲音。我雖然使用類加載器將解決這個問題,但沒有運氣。幫助將不勝感激!

回答

1

當您的資源可能位於jar文件中時,請勿使用FileInputStream - 請使用ClassLoader.gerResourceAsStreamClass.getResourceAsStream。這就是他們在那裏。你還沒有得到在磁盤上的一個單獨的文件,所以它是沒有意義的嘗試使用它FileInputStream

(當然,你可以發現你沒有將提供適當的資源 - 但那是另外一個問題。)

所以只需使用:

Player p = new Player(getClass().getResourceAsStream("/music/45.mp3")); 
p.play(); 

(從你代碼,它看起來就像比你所需要的更早地聲明你的變量 - 或者甚至可能把它們聲明爲字段,當它們在邏輯上只是局部變量時,值得關注的是,確保你只在你使用字段時真的想指示類或實例的某些狀態,並聲明局部變量儘可能晚 - 理想情況下是在初始化階段。)

+0

好吧有道理。爲了理解FileInputStream在這種情況下的功能:假設我將可執行jar放在一個名爲「player」的文件夾中,並將另一個文件夾放在「player」中稱爲「media」。然後,我會讓該程序在相對位置的jar文件之外尋找名爲「media」的文件夾。 FileInputStream會適用於那麼? –

+1

@DillonBurton:不,因爲MP3資源*不是文件*。它包含在一個jar文件中。 'FileInputStream'從磁盤上的文件中讀取數據 - 不是*文件內嵌入的東西。 –

+0

好吧,真的清除了事情。謝謝,先生,+1。 –

相關問題