【问题标题】:Why does getResourceAsStream() not work in JAR files?为什么 getResourceAsStream() 在 JAR 文件中不起作用?
【发布时间】:2015-08-22 02:00:16
【问题描述】:

我在静态方法中有以下代码:

clips.open(AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("folder/sound.wav")));

另外,folderSound.java 位于同一目录中。当我在 Eclipse 中运行程序时,会播放声音。但是,当我将文件导出到 JAR 文件时,声音不再播放。

如果我将getResourceAsStream() 更改为getResource(),Eclipse 和 JAR 文件都会播放声音。为什么会这样?我已经阅读了很多人建议 getResourceAsStream() 在 JAR 文件中根本不起作用。是这样吗,如果是这样,为什么不呢?

【问题讨论】:

  • 我怀疑您的 getResource 在 JAR 案例中的工作方式有什么不同。
  • 不。使用 getResource(),JAR 文件可以正确播放声音。其他人似乎也注意到了这一点,例如 herehere
  • 有趣的链接。我注意到,在这些线程上,他们没有遵循确定一个有效而另一个无效的真正原因。我怀疑它是否涉及 InputStream 的使用(根据我的回答)。但是,声明生命太短暂也是有道理的,如果你有一些有用的东西,那就继续吧!

标签: java audio jar inputstream getresource


【解决方案1】:

我怀疑问题在于 Class.getResourceAsStream(String) 返回一个 InputStream,而 Class.getResource(String) 返回一个网址。因此,在第一种情况下,我们实际上是使用

AudioSystem.getAudioInputStream(InputStream inputStream) 

在第二种情况下,使用

AudioSystem.getAudioInputStream(URL url).

为什么这很重要?我认为主要问题是当 InputStream 是参数时,对您的音频文件进行标记/重置测试并且它失败了。当 URL 用作参数时,不会发生此测试。您可以查看 AudioSystem.getAudioInputStream 的 API 以确认我在此处报告的内容。

getResourceAsStream 失败时是否收到错误消息?它是否偶然提到了标记/重置测试错误?如果您收到不同的错误消息,那么这可能不是正确的答案,并且正在发生其他事情。

【讨论】:

  • 无标记/重置错误。但是,在打印堆栈跟踪时,有一些FileNotFoundExceptions。然而,这是意料之中的。我的程序的工作方式是用户选择一个包含文件的文件夹,然后将这些文件加载​​到程序中。因此,有时用户可能没有某个文件(这不是必需的),这应该不是问题。另外,getResource()getResourceAsStream() 我都得到了FileNotFoundException,所以这不应该是getResourceAsStream() 无法播放声音的原因。
  • 1) 您能否隔离失败实例的错误消息?换句话说,尝试加载一个您知道存在且不应引发“未找到”的文件,并且在您使用 getResourceAsStream 而不是 GetResource 时发生错误? 2) 我曾经遇到过 InputStream 阶段失败(由于标记/重置)但调用方法 getAudioInputStream() 对此失败的反应,将其报告为“未找到文件”而不是传递较低级别的错误。你刚才给我的信息并不能完全排除这种可能性,但真正的原因仍然是个谜。
猜你喜欢
  • 2013-04-09
  • 1970-01-01
  • 2013-05-18
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2018-03-19
  • 1970-01-01
相关资源
最近更新 更多