资源.wav中的Javaexception读取流

我猜我的代码没问题,我的.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.(MainWindowOperations.java:81) at graphics.LaunchGraphics.(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(); } } 

有人能帮我吗? 非常感谢!!

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

解决它的一种方法是将原始流的byte[]放入ByteArrayInputStream ,它支持mark / reset。


关于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); 

我在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写道:我对这个问题没有具体的了解,或者一般都没有applet中的音频,但是我对标记/重置不适用于通过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 Bug参考#7095006这是一个有趣的读物,因为它解释为什么代码(正如op最初尝试的那样)曾经工作但不再适用。