Java中的音频:为什么我会得到“null”?

时间:2014-01-04 17:38:55

标签: java audio javasound

以下代码会运行,但会打印null。最终目标是播放歌曲,并可以通过按取消按钮来停止播放。有任何想法吗?感谢..

这是我的代码:

if (song.equals("Dan + Shay - 19 You + Me")){//if this song is selected...
        try{
            stopPlay();
            AudioInputStream audio = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("C:\\Stuff\\Grade Twelve\\Computer Programming\\Unit 4\\Step 3\\GuitarForBeginners\\src\\guitarforbeginners\\resources\\You+Me.wav"));
            clip = AudioSystem.getClip();
            clip.open(audio);
            clip.start();
        } catch(Exception e){
            stopPlay();
            System.err.println(e.getMessage());
}

1 个答案:

答案 0 :(得分:1)

我认为问题可能在于您如何处理音频文件。由于你有一个完整的路径,你可以放入文件位置并省去“getClass()。getResourceAsStream()”部分。

此形式的getAudioInputStream()的规范位于以下URL: getAudioInputStream(File file)

我认为getResource()和getResourceAsStream()更适合加载打包在jar文件中的资源,在那里你需要知道并利用jar的文件位置或URL。 AFAIK,通过使用getResource(String name)和getResourceAsStream(String name),您将自动在主机对象的文件位置前面添加指定字符串“name”,从而创建一个非常纠结的文件名。这些方法的规范中使用的术语“绝对”是指宿主对象的绝对位置。有一些关于如何在getResourceAsStream(String name)getResource(String name)的规范中构建地址的信息。

另一个预防措施(感谢Andrew指出这一点):如果您确实需要使用类文件的地址作为锚点或起点,那么使用getResource(音频文件)可能更安全字符串名称)比getResourceAsStream(String name)。后者返回一个InputStream,而InputStreams可能会检查标记或重置流的能力。音频文件似乎并不总是具有此功能,因此可能会抛出错误。 getResource(String name)返回一个URL,该URL可以用作getAudioInputStream(URL url)的输入参数,绕过InputStream的使用。