从jar文件中读取声音文件

5

我正在制作一个游戏,并决定为它添加音效。我可以播放声音,直到我将类文件和wav音频文件打包成jar,才发现它找不到这些文件。我使用getClass().getResource("sounds/enemyExplode.wav")获取文件。我是否应该使用不同的方法?提前感谢您!


sounds文件夹应该放在src文件夹内。 - Eng.Fouad
音频文件是否在jar包中? - hd1
5
getClass().getResource()接受一个相对路径(到包),如果要获得一个“绝对”路径(在JAR内),则需要前导/ - biziclop
请定义“找不到文件”并发布您的代码;发生了什么事情,确切地说?此外,您的声音文件在.jar文件中的哪里? - Brian Roach
我会尝试一下开头,看看是否可行。谢谢。WAV文件在/ sounds /中的jar包中。 - DudeOfAwesome
我正在使用一个预先构建的类来播放我的声音链接,但我不知道那个文件里面发生了什么。我正在使用构造函数codenew AePlayWave(getClass().getResource("/sounds/enemyExplode.wav").toString().split(":")[2]).start();codecodegetClass().getResource("/sounds/enemyExplode.wav").toString().split(":")[1]code获取文件的URI,然后将其转换为字符串,然后在“:”之后拆分它,因为我使用的类不喜欢它在那里,然后它返回第二部分。 - DudeOfAwesome
3个回答

3

在一个jar包中,我发现使用getResourceAsStream()方法可以更好地工作。如果你正在使用AudioInputStream,那么这个方法同样适用:

AudioInputStream ais = AudioSystem.getAudioInputStream
(Sound.class.getResourceAsStream(fileName));

这是文件名应该看起来的方式(在您的情况下,soundbase是 "sounds"):
"/" + soundbase + "/" + file.wav

我有一个完全运作正常的声音类,几年前在某个地方在网上找到的,它工作得非常好。我稍微修改了它,但如果你要我发布它,它应该在大多数情况下都能正常工作。


3
类加载器的 getResource() 方法操作的是类路径内的资源。如果您在 JAR 包中的以下位置拥有声音文件:
/sounds/enemyExplode.wav

然后,在调用中需要在路径前面使用一个前导斜杠(就像上面一样)。

请记住,JAR文件实际上只是文件系统的打包版本(与zip格式相同),类加载器以与文件系统相同的方式对其进行操作。


声音文件在jar文件中,我正在使用文件前面的斜杠。 - DudeOfAwesome

1
首先,请确保您的声音实际上已经打包在JAR文件中。您可以使用任何支持ZIP格式的归档工具打开JAR文件。
其次,当您调用blabla.getClass().getResources("sounds")时,您是相对于blabla的类路径操作的,这意味着包含blabla的完整包名称将被添加到"sound"以解析JAR文件中的完整路径。
如果您想指定绝对路径,请在路径前加上斜杠:blabla.getClass().getResources("/sound")

声音文件在jar文件中,我正在使用文件前面的斜杠。 - DudeOfAwesome

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接