我正在使用的音频文件在这里找到:http://www.orangefreesounds.com/loud-alarm-clock-sound/
在我的Eclipse IDE中,我的文件结构如下所示:
当我在IDE中运行它时,音频文件可以正常播放,但是当我将其导出为JAR文件时却不能播放。我已经检查并发现音频文件在JAR文件中。
我使用终端命令
为什么会出现这个问题,我该如何解决?
奇怪的更新
好吧,实际上,在Windows 8.1的
奇怪的更新#2
我确认JAR文件只能在
最小、完整和可验证的示例(在Windows或Ubuntu上都无法工作)
我使用终端命令
java -jar Sandbox.jar &
来运行JAR文件。程序似乎能够找到文件(因为它没有抛出IOException),但似乎无法执行播放。为什么会出现这个问题,我该如何解决?
奇怪的更新
好吧,实际上,在Windows 8.1的
cmd
或PowerShell
中运行JAR文件时,它可以播放音频文件,但在Ubuntu 14.04的终端中却不能播放。整个时间,我一直在尝试在Ubuntu 14.04中运行JAR文件。奇怪的更新#2
我确认JAR文件只能在
Windows 8.1
系统上工作。本问题中的两个代码片段都无法工作,而MadProgrammer的两个解决方案都可以工作。最小、完整和可验证的示例(在Windows或Ubuntu上都无法工作)
import java.io.IOException;
import java.net.URL;
import javax.sound.sampled.*;
public class Sandbox
{
public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException
{
URL url = Sandbox.class.getResource("/sound-effects/alarmSoundClip.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
AudioFormat af = ais.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, af);
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(ais);
clip.start();
}
}
尝试解决方案#1(在Windows或Ubuntu上不起作用)
一个尝试的解决方案(由Andrew Thompson建议)是使用this.getClass().getResource( ... )
而不是Sandbox.class.getResource( ... ):
import java.io.IOException;
import java.net.URL;
import javax.sound.sampled.*;
public class Sandbox
{
public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException
{
new Sandbox();
}
public Sandbox() throws UnsupportedAudioFileException, IOException, LineUnavailableException
{
URL url = this.getClass().getResource("/sound-effects/alarmSoundClip.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
AudioFormat af = ais.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, af);
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(ais);
clip.start();
}
}
URL url = Sandbox.class.getResource("/sound-effects/alarmSoundClip.wav");
可能会获取错误的类加载器。重新排列代码,使其可以表达为URL url = this.getCass().getResource("/sound-effects/alarmSoundClip.wav");
。其中一种方法是将该语句移动到Sandbox
构造函数中。 - Andrew Thompsonclip.start
后添加clip.drain()
。clip.start
不是阻塞方法,因此它会启动另一个线程,这可能会导致 JVM 在退出main
方法后立即终止。 - MadProgrammerjava -jar Sandbox.jar
命令运行(不要加上&
...) - MadProgrammer