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

audio reading in jar executable file

在我的 eclipse 中,当我 运行 它时,一切正常,音频也正常,但我在创建 .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 cannot be转换为 java.io.BufferedInputStream

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

我认为这个问题之前已经被问过和回答过。请在此处查看已接受的答案以获取详细说明:java.io.IOException: mark/reset not supported

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

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

您看到行为差异的原因是在 Eclipse 中,getResourceAsStream 返回支持 read/mark 的 InputStream。当您从 jar 中 运行 时,您将获得不支持 read/mark (JarURLInputStream) 的 InputStream 的实现。

如果您将返回的输入流包装在新的 BufferedInputStream 中,当您 运行 装入 jar 时,您将在流中获得 read/mark 支持,并且您的代码将在任何地方运行。

另外,您收到 ClassCastException 是因为您试图将 getResourceAsStream() 返回的输入流转换为 BufferedInputStream。不要投它;相反,将返回的输入流包装在一个新的 BufferedInputStream() 中,就像我在上面的代码片段中所做的那样。