2012-11-12 98 views
1

我想訪問我的項目中的包中的.wav文件。Java包中的訪問文件(.wav)

比如我有兩個包:

  • program
  • sounds

program/something.class裏面我想打sounds/asound.wav。 這可能怎麼樣?

clip.open(AudioSystem.getAudioInputStream(new File(filename))); 
clip.start(); 
//.... something inbetween 
clip.stop(); 

這裏filenameC:\\projects\\something\\sounds\\,但怎麼可能就這樣給在包asound.wav相對路徑?

+0

還不行。出於某種原因,我在'getResource'處得到'NullPointerException'。它在那裏,文件存在。 – Highmastdon

回答

3

使用ClassLoader.getResourceAsStream通過您用於類加載的相同基礎結構加載資源。根據類加載器,這可以是目錄中的文件,本地JAR文件的內容或遠程資源。

getClass().getClassLoader().getResourceAsStream("asound.wav"); 

正如方法的名稱所示,你會得到一個InputStream的資源,而不是一個文件。如果您認爲資源可能是其他文件(如JAR文件)的一部分,則這是有道理的,因爲File對象始終指向單個文件,而不是其中的一部分。

+0

'getResourceAsStream(..)'通常會在Java Sound中失敗。它似乎需要一個可重新定位的InputStream,而從getResourceAsStream(..)返回的流通常不能。 –

+0

您可以通過以下網址訪問代碼:https:// bitbucket。組織/ EXOR /星際-2-通話/ ​​SRC/02207cf263f8e6ec0a4fbbca47260cf0d6bc7a07/starcraft_2_talk/GameCounter.java在主=#CL-108? – Highmastdon

1
URL url = this.getClass().getResource("/sounds/asound.wav"); 

當提供給從類中獲得的類加載器的/前綴,將導致其從所述包裝的「根」搜索。


然後看到在Java Sound tag Wiki用於加載Clip,併發揮它顯示的代碼。

1

由於還提到here:爲AudioSystem.getAudioInputStream(InputStream)的文件說:

這種方法可能 需要多個解析器的執行檢查 流,以確定它們是否 支持。這些解析器必須能夠 標記流,讀取足夠的數據 以確定它們是否支持 流,如果不支持,則將流的讀取指針重置爲其原始位置的 位置。如果輸入流 不支持這些操作,則此方法 可能會因IOException異常而失敗。

因此該解決方案將是

clip.open(AudioSystem.getAudioInputStream(
    new BufferedInputStream(getClass().getResourceAsStream("/Sounds/asound.wav"))));