声音没有在jar子里播放

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

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

码:

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

执行此行时获取null

对已经提出的理论的替代理论。 通常成功的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上存档内容的“快速和脏”方法。

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

然后

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

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

似乎getResourceAsStream()不适用于jar。 但是, 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()); } } 

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

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

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

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