从我的包中读出声音的路径

时间:2014-04-13 10:38:16

标签: java audio clip

我有一个加载和播放声音的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");
}

这里还有一张树的图片

Tree

1 个答案:

答案 0 :(得分:0)

现在,由于异常消息,我们知道问题究竟是什么。问题不在于无法加载声音或在jar中找不到声音。问题是,正如the javadoc所说:

  

这些解析器必须能够标记流,读取足够的数据以确定它们是否支持流,如果没有,则将流的读指针重置为其原始位置。如果输入流不支持这些操作,则此方法可能会因IOException而失败。

当从jar加载资源时,Class.getResourceAsStream()返回的流不支持这些操作。因此,您可以做的是从输入流读取内存中的所有内容,从该字节数组创建ByteArrayInputStream,并将该流传递给AudioSystem.getAudioInputStream()

如果加载内存中的所有内容都不是一个选项,因为声音很长(但我猜你不会把它放在jar中),那么你可以将它写入一个临时文件,然后传递一个FileInputStream来AudioSystem.getAudioInputStream()