我已将所有类文件和资源打包为jar但在执行时声音文件不会播放。我的包结构是:
+project
|_classes
|_ _*.class
|_resources
|_ _ *.jpg,*.wav
代码:
AudioInputStream inputStream = AudioSystem.getAudioInputStream(kidsClassRoom.class.getResourceAsStream("../resources/"+file));
执行此行时获得null
!!
答案 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
的包,如下所示
然后
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);
如果资源位于子文件夹中,请记住将其添加到文件名路径中。