jar可执行文件中的音频读取

时间:2015-06-18 17:49:44

标签: java file audio jar inputstream

在我的日食中,当我运行它时,一切正常,音频也没问题,但是当我创建.jar可执行文件时,我遇到了问题。音频文件在我的包中,我用getResourceAsStream读取它,所以我只是想让你知道。这是问题..

InputStream input = getClass().getResourceAsStream("/optician/funny-doorbell.wav");
AudioInputStream audioIn;
try{
Clip clip;
audioIn = AudioSystem.getAudioInputStream(input);
clip=AudioSystem.getClip();
clip.open(audioIn);
clip.start();
} catch (UnsupportedAudioFileException | IOException e1) {
e1.printStackTrace();
} catch (LineUnavailableException e1) {
e1.printStackTrace();
}

在第一种情况下,当我使用eclipse运行时,它工作正常,但是当我运行.jar可执行文件时,我得到:reset / mark不受支持。

第二种情况是一样的但是:

BufferedInputStream input = (BufferedInputStream) getClass().getResourceAsStream("/optician/funny-doorbell.wav");

所以一切都是一样的,重点是我现在尝试使用BufferedInputStream,但我现在遇到的问题是:线程中的异常" AWT-EventQueue-0" java.lang.ClassCastException:sun.new.www.protocol.jar.JarURLConnection $ JarURLInputStream无法强制转换为java.io.BufferedInputStream

我在linux和windows中试过但它不起作用。问题出在哪儿 ?

1 个答案:

答案 0 :(得分:1)

我认为这个问题之前已经被提出并得到了回答。请参阅此处接受的答案以获取详细说明:java.io.IOException: mark/reset not supported

那就是说,我相信您可以通过修改第一行来修复代码,如下所示:

InputStream input = new BufferedInputStream(getClass().getResourceAsStream("/optician/funny-doorbell.wav"));

您看到行为差异的原因是,在Eclipse中,getResourceAsStream返回一个支持读/标记的InputStream。当你用完jar时,你得到的InputStream实现不支持read / mark(JarURLInputStream)。

如果将返回的输入流包装在新的BufferedInputStream中,当您在jar中运行时,您将在流中获得读取/标记支持,并且您的代码可以在任何地方使用。

此外,您正在获取ClassCastException,因为您正在尝试将getResourceAsStream()返回的输入流强制转换为BufferedInputStream。不要施展它;相反,将返回的输入流包装在新的BufferedInputStream()中,就像我在上面的代码片段中所做的那样。