【发布时间】:2014-04-13 10:38:16
【问题描述】:
我有一个加载和播放声音的 Sons 类。还有一个包含主类并使用这个 Sons 类的 adhd 类。
我所有的课程都在“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");
}
这也是树的图片
【问题讨论】:
-
路径显然取决于声音文件的位置。你不说,我们怎么知道?没有神奇的路径可以“从你的包裹中”找到所有东西,不管这意味着什么。
-
我只是在等你给我开路。假设我的文件位于主项目文件夹中。在根目录中。
-
也许我会告诉你我为什么要问。因为当我想访问我的类包中文件夹“sounds”中的声音时,我必须编写“/sounds/1.wav”。而且我需要 jar 来读取我的声音,所以我被告知将它们放入源文件夹中。所以当我这样做时,我有一个名为“src/sounds”的文件夹,它本身就在项目文件夹中。但我找不到如何访问它,甚至找不到位于项目文件夹(项目根目录)中的声音。
-
Class.getResourceAsStream() 使用类路径来加载资源。它不能加载不在类路径中的目录或 jar 之外的任何内容。如果声音在类路径中的目录/jar 中,则使用stackoverflow.com/a/23041578/571407 中描述的规则加载它。否则,使用文件 IO。
-
问题是我真的需要使用这种方法,因为我想在实例中加载我的声音以便在程序中读取它们(否则会出现错误,因为我使用每 0.5 秒读取一次声音的计时器) .或者我怎样才能让我的 jar 读取包中的声音?有解决办法吗? (我可以在 Eclipse 中读取它们,但在运行 jar 时不能)。