2013-01-22 254 views
0

我想將一個.wav文件加載到內存中,但它一直告訴我該文件不存在。Java獲取資源的相對路徑

String filename; 

public MyClass(String _filename){ 
filename = _filename; 
} 

public void run(){ 
    InputStream in = View.class.getClassLoader().getResourceAsStream("/sounds/"+filename); 

    File inputFile = new File(in.toString()); 
    if(!inputFile.exists()){ 
     System.err.println("Wave file not found: " + in.toString()); 
     return; 
    } 
} 

控制檯:

Wave file not found: [email protected]

Wave file notfound: [email protected]

的文件是在程序包的文件夾。這是一個在

myPackage/sounds/write.wav

編輯:

其實我要加載的聲音:

InputStream in = this.getClass().getResourceAsStream("sounds/"+filename); 

AudioInputStream audioInputStream = null; 
try { 
    audioInputStream = AudioSystem.getAudioInputStream(in); 
} catch (UnsupportedAudioFileException e1) { 
     e1.printStackTrace(); 
     return; 
} catch (IOException e1) { 
     e1.printStackTrace(); 
     return; 
} 

但控制檯仍與錯誤:

Exception in thread "Thread-6" Exception in thread "Thread-7" java.lang.NullPointerException at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(Unknown Source) at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source) at com.chrissman.threads.AePlayWave.run(AePlayWave.java:47) java.lang.NullPointerException at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(Unknown Source) at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source) at com.chrissman.threads.AePlayWave.run(AePlayWave.java:47)

+0

將您的聲音目錄移至項目的根目錄中。 – user1929959

回答

0

資源可以是用絕對路徑和相對路徑查找兩者。你現在擁有的絕對路徑是從/開始。所以把它改成/myPackage/sounds/write.wav。一般來說,我更喜歡絕對路徑,因爲很難確定哪個包是相對路徑的「當前」。

+0

以及如何使用絕對路徑? –

+0

如果第一個字符是'/',那麼您將其稱爲絕對路徑。 –

+0

仍然無法正常工作。 –

1

in.toString()不返回用於打開流的路徑,它返回的類名,然後哈希:[email protected]

錯誤是因爲您的當前目錄中沒有名爲[email protected]的文件。

既然你得到了一個對象而不是null作爲in它發現你的文件。您無法使用File對象獲取此文件,但可以通過in對象訪問它。從流中讀取內容並使用它。

+0

和我應該在哪裏調用in.avaible()?這是我的問題的解決方案? –

+0

幾乎沒有理由調用'available()'。 –

+0

我編輯它。我的意思是,你的文件打開確定。但是沒有需要的File對象。 –