我正在使用 Netbeans,我试图弄清楚如何将我的所有库、音乐、图像等放在一个 JAR 文件中进行分发。我想我已经弄清楚了库,但是音频、图像和其他此类文件给我带来了麻烦。
在我当前的项目中,我有一个音频文件,我也想将它嵌入到 JAR 文件中。首先我尝试过one-jar
,但几个小时后我放弃了。我将音频文件放入 JAR 文件中就好了,但我无法从我的程序中访问它。我知道我需要按照这里getResourceAsStream
的建议使用,但我不清楚在获得输入流后我会做什么。我能看到使它工作的唯一方法是使用并创建一个全新的文件(见下文......它工作),但创建一个新文件似乎是一种浪费(我不希望人们看到我的程序运行时出现的音频文件)。 有没有办法直接访问仍然包含在文件中的音频文件?InputStream
.JAR
File file = new File("myAudio.wav");
InputStream stream = mypackage.MyApp.class.getResourceAsStream("audio/myAudio.wav");
try {
OutputStream out = new FileOutputStream(file);
byte buf[] = new byte[1024];
int len;
while ((len = inputStream.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
inputStream.close();
} catch (IOException e) {
}
编辑:
我的 JAR 文件的内部结构包含 1.) 一个库包 ( Jama ),2.) 我的包,它是我的类文件的直接父级和一个名为“audio”的文件夹,其中包含myAudio.wav
3.) 一个META-INF
文件夹,其中包含我的manifest.mf
.
编辑
像这样读取音频流。我曾尝试InputStream
直接使用,但我没有成功。我想再次指出,当我从包含JAR
文件的音频文件的输入流创建一个新的音频文件时,我已经有了它,但是就像我之前所说的,每次程序创建一个大的音频文件似乎是一种浪费当文件已存在于JAR
. 这种文件重新创建是我试图避免的。
AudioInputStream stream;
Clip music;
try {
stream = AudioSystem.getAudioInputStream(file);
} catch (IOException e) {
} catch (UnsupportedAudioFileException e) {
}
try {
music = AudioSystem.getClip();
} catch (LineUnavailableException e) {
}
try {
start();
} catch (Exception e) {
}
public void start() throws Exception {
music.open((AudioInputStream) stream);
music.start();
music.loop(Clip.LOOP_CONTINUOUSLY);
}