0

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

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

代码:

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

null执行此行时得到一个!

4

5 回答 5

2

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

// 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 并双击它是在 Windows 上检查存档内容的“快速而肮脏”的方式。

于 2011-02-07T17:22:25.607 回答
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());
        }
}
于 2013-03-09T14:00:27.797 回答
1

创建一个包resources,如下图所示 在此处输入图像描述

然后

 AudioSystem.getAudioInputStream(kidsClassRoom.class.getResourceAsStream("resources/"+file));
于 2011-02-07T16:50:55.550 回答
0

当你这样做时getResourceAsStream,它不是相对于当前类,而是档案的根。也就是说,首先尝试删除../.

于 2011-02-07T16:48:17.887 回答
0

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

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

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

于 2016-06-28T12:28:09.350 回答