我有一个加载和播放声音的Sons类。还有一个adhd类,它包含main并使用这个Sons类。
我的所有课程都在“adhd”包中,我在jar中的声音是这样的:1.wav是在jar中的SoundN中。 (ADHD.jar / SoundN / 1.wav)。
当我在Eclipse中运行代码时,它可以正常工作,但是当我运行jar时它不会。对我来说重要的是保持声音“加载”,因为我需要我的程序快速读取我的声音,因为我正在使用计时器。你建议我做什么?
这是我的类Sons的代码,它在单例实例中加载声音。
父子
package adhd;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.URL;
public class Sons {
private static String PATH=null;
private static Sons instance;
private final Map<String, Clip> sons;
private boolean desactive;
Sons(String path) {
PATH = path;
sons = new HashMap<String, Clip>();
}
public void load(String nom) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
Clip clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(getClass().getResourceAsStream(PATH + nom)));
sons.put(nom, clip);
}
public void play(String son) {
if(!desactive) try {
Clip c = getSon(son);
c.setFramePosition(0);
c.start();
} catch(Exception e) {
System.err.println("Impossible to play the sound " + sound);
desactive = true;
}
}
}
这是包含使用声音的主要内容的adhd类
主要课程:adhd
public static void main(String[] args) {
Sons sonN= new Sons("/SoundN/");
try {
sonN.load("1.wav");
} catch (UnsupportedAudioFileException | IOException
| LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sonN.play("1.wav");
}
这里还有一张树的图片
答案 0 :(得分:0)
现在,由于异常消息,我们知道问题究竟是什么。问题不在于无法加载声音或在jar中找不到声音。问题是,正如the javadoc所说:
这些解析器必须能够标记流,读取足够的数据以确定它们是否支持流,如果没有,则将流的读指针重置为其原始位置。如果输入流不支持这些操作,则此方法可能会因IOException而失败。
当从jar加载资源时,Class.getResourceAsStream()
返回的流不支持这些操作。因此,您可以做的是从输入流读取内存中的所有内容,从该字节数组创建ByteArrayInputStream
,并将该流传递给AudioSystem.getAudioInputStream()
。
如果加载内存中的所有内容都不是一个选项,因为声音很长(但我猜你不会把它放在jar中),那么你可以将它写入一个临时文件,然后传递一个FileInputStream来AudioSystem.getAudioInputStream()
。