【问题标题】:Reading sound files from jar file从 jar 文件中读取声音文件
【发布时间】:2013-07-09 05:56:56
【问题描述】:

所以我一直在制作游戏,并决定为它制作音效。我可以很好地播放声音,直到我将类文件和(和 wav 音频文件)打包到 jar 中,却发现它找不到文件。我正在使用getClass().getResource("sounds/enemyExplode.wav") 来获取文件。我应该使用其他方法吗? 提前致谢!

【问题讨论】:

  • sounds 文件夹应放在src 文件夹内。
  • jar 本身是 wav 文件吗?
  • getClass().getResource() 接受一个相对路径(到包),如果你想要一个“绝对”路径(即在 JAR 中),则需要一个前导 /
  • 定义“找不到文件”并发布您的代码;究竟会发生什么?另外,.jar 中的声音文件在哪里?
  • 我会尝试开始 / 看看是否有效。谢谢你。 wav 文件位于 /sounds/ 的 jar 中。

标签: java audio jar


【解决方案1】:

类加载器的 getResource() 方法对类路径中的资源进行操作。如果您在 JAR 中的以下位置有声音:

/sounds/enemyExplode.wav

然后,您需要在该调用中的路径前使用前导斜杠(如上所述)。

请记住,JAR 文件实际上只不过是文件系统的打包版本(与 zip 格式相同),类加载器对其进行操作就像它是文件系统一样。

【讨论】:

  • 声音文件在jar文件里,我用的是文件前面的斜线
【解决方案2】:

在 jar 中,我了解到使用 getResourceAsStream() 效果更好。如果您使用的是 AudioInputStream,那么它也同样有效:

AudioInputStream ais = AudioSystem.getAudioInputStream
(Sound.class.getResourceAsStream(fileName));

这就是文件名的外观(soundbase,在您的情况下是“声音”):

"/" + soundbase + "/" + file.wav

我有一个功能齐全的声音课程,几年前我在网上的某个地方找到了它,效果很好。我稍微修改了它,但如果您希望我发布它,它应该适用于大多数情况。

【讨论】:

    【解决方案3】:

    首先,确保您的声音实际打包在 jar 文件中。您可以使用任何支持 zip 的存档器打开 jar 文件。

    其次,当您调用blabla.getClass().getResources("sounds") 时,您相对于blabla 的类路径进行操作,这意味着包含blabla 的完整包名将被添加到“sound”之前,以解析jar 文件中的完整路径。

    如果要指定绝对路径,只需在路径前加上斜线:blabla.getClass().getResources("/sound")

    【讨论】:

    • 声音文件在jar文件里,我用的是文件前面的斜线