声音没有在罐子里播放

时间:2011-02-07 16:46:21

标签: java jar javasound

我已将所有类文件和资源打包为jar但在执行时声音文件不会播放。我的包结构是:

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

代码:

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

执行此行时获得null !!

5 个答案:

答案 0 :(得分:2)

已经提出的替代理论。通常成功的getResource()调用依赖于调用的类加载器实例来定位它们。出于这个原因,我建议使用一个用户定义对象的实例,从中调用getResource()。 E.G。

// 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!将.jar复制/重命名为.zip并双击它是'quick& amp;脏的方法来检查Windows上的存档内容。

答案 1 :(得分:1)

创建一个名为resources的包,如下所示 enter image description here

然后

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

答案 2 :(得分:1)

这是我在jar中播放循环声音文件的功能,它对我来说很好。

似乎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());
        }
}

答案 3 :(得分:0)

执行getResourceAsStream时,它与当前类不相关,而是与归档的根目录相关。也就是说,首先尝试删除../

答案 4 :(得分:0)

需要注意的重要一点是,在导出的jar中,资源不会存储为文件(请在某处阅读,请更多知识渊博的人输入)。因此,最好先将资源作为URL对象获取,然后将其传递给AudioInputStream对象。

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

如果资源位于子文件夹中,请记住将其添加到文件名路径中。