【问题标题】:Java Exception Reading Stream from Resource .wav从资源 .wav 读取流的 Java 异常
【发布时间】:2012-03-28 10:13:22
【问题描述】:

我猜我的代码没问题,我的 .jar 文件里面的 .wav 也没问题.. 但是当我尝试使用 getResourceAsStream 加载它时,我得到一个错误..

这是我的错误:

java.io.IOException: mark/reset not supported
    at java.util.zip.InflaterInputStream.reset(Unknown Source)
    at java.io.FilterInputStream.reset(Unknown Source)
    at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(Unkno
wn Source)
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at operation.MainWindowOperations.prepareAudio(MainWindowOperations.java
:92)
    at operation.MainWindowOperations.<init>(MainWindowOperations.java:81)
    at graphics.LaunchGraphics.<init>(LaunchGraphics.java:25)
    at run.RunApp.main(RunApp.java:14)

这是我的代码:

private void prepareAudio() {
    try {

        InputStream is = this.getClass().getClassLoader().getResourceAsStream("beep.wav");
        inputStream = AudioSystem.getAudioInputStream(is);
        clip = AudioSystem.getClip();
        clip.open(inputStream);

    } catch (Exception ex) {
        ex.printStackTrace();

    }

}

有人可以帮助我吗?提前非常感谢!

【问题讨论】:

  • 您可以在此 [post][1] 中找到您的答案。 [1]:stackoverflow.com/questions/5529754/…
  • @EricR。 +1 该线程包含两个我不知道的潜在捷径。
  • 它对我不起作用,它给了我另一个错误...流已关闭..
  • 用那个解决方案我明白了,我不明白..:pastebin.com/6taaMJKG 我的代码在这里:pastebin.com/8wamm4E1 非常感谢你们;)
  • 一个有趣的问题,我从中学到了一些关于流的知识。 :)

标签: java resources wav embedded-resource javasound


【解决方案1】:

Java Sound 需要用于某些操作的可重新定位(支持标记/重置)输入流。如果您遇到此问题,那是因为流不可重新定位。

绕过它的一种方法是将原始流的byte[] 放入支持标记/重置的ByteArrayInputStream


Eric R. 链接的问题的第二个答案也是一种可能性,而且看起来更简单。要尝试,请更改..

InputStream is = this.getClass().getClassLoader().getResourceAsStream("beep.wav");
inputStream = AudioSystem.getAudioInputStream(is);

收件人:

URL url = this.getClass().getClassLoader().getResource("beep.wav");
inputStream = AudioSystem.getAudioInputStream(url);

【讨论】:

  • 真的吗? Java 的声音似乎很糟糕:s 我需要使用字节数组吗?然后循环整个数组播放每个字节? :s 在此先感谢
  • "然后循环整个数组并播放每个字节" 不,只需将ByteArrayInputStream 传递给AudioSystem.getAudioInputStream(..),其余代码就可以按原样工作。
  • 我不明白你的意思 Andrew.. 你的意思是:ByteArrayInputStream b = (ByteArrayInputStream) this.getClass().getResourceAsStream("beep.wav"); inputStream = AudioSystem.getAudioInputStream(b); ?提前非常感谢
  • @Andrew - +1 包括“URL”答案。看来,这个问题肯定会多次出现。 ByteArrayInputStream 的答案是一种巧妙的解决方法,但是当所有要做的就是避免从音频文件创建 InputStream 时,这可以通过 URL 加载来完成。
  • 我尝试实现你告诉我的第二个选项,因为我的项目根目录上有 beep.wav,所以 URL 上出现错误返回 null,我更改为包文件夹,我在其中有我的类加载资源。现在它可以正常工作了。非常感谢您的第二个选择!它非常好用!非常感谢朋友!
【解决方案2】:

在 JavaRanch 的 Tim Moores 的帮助下,我得到了答案。我认为最清楚的事情就是把它贴在这里,即使安德鲁在他的答案的第二部分提到了这个正确的答案。 (第一部分也可以,但有点过头了。)

Url url = this.getClass().getResource("beep.wav");           
inputStream = AudioSystem.getAudioInputStream(url);

http://www.coderanch.com/t/558274/Applets/java/mark-reset-not-supported-getResourceAsStream

Tim 写道:我对这个问题或小程序中的音频没有具体的了解 一般来说,但我对标记/重置不起作用并不感到惊讶 通过 ClassLoader 机制获取的资源。 (其实我是 有点惊讶它完全有效,至少在某些时候:-)

假设音频文件可通过 HTTP 公开访问,请尝试 AudioSystem.getAudioInputStream(URL) 而不是 InputStream 您现在使用的版本。看着 javax.sound.sampled.spi.AudioFileReader javadocs(这是类 在下面使用),只有 InputStream 变体谈论 标记/重置问题,而不是 URL 版本。

这也出现在这里: https://forums.oracle.com/forums/thread.jspa?threadID=2289395&tstart=0 答案就在底部附近,还有一个 Oracle 错误参考 #7095006,读起来很有趣,因为它解释了为什么代码(正如操作最初尝试的那样)过去可以工作,但现在不再工作了。

【讨论】:

  • 谢谢安德鲁!我记得你也是我的第一个+10分。新年快乐!
猜你喜欢
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多