我做了一个小游戏,需要在上面播放背景音乐,我有图像、一个 txt 文件和一个音频文件,除了音频文件外,它们在导出 JAR 后都可以工作。
这是我用来导入的代码:
图片 :
(new ImageIcon(getClass().getResource("/data/131868.jpg"))
文本文件 :
BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/data/dictionnaire.txt")));
音频文件(我还包括了我在搜索时找到的播放代码):
File f =new File(Main.class.getResource("/data/gmu.mp3").getFile());
final Player p=Manager.createRealizedPlayer(f.toURI().toURL());
p.start();
while(true){
if(p.getMediaTime().getSeconds()==p.getDuration().getSeconds()){
p.stop();
p.setMediaTime(new Time(0));
p.start();
}
}
基本上File
对象是:File f = new File("/data/gmu.mp3")
我只是添加了修改以使其看起来像其他对象......
它确实在Eclipse中起作用,但不能在JAR中工作。
你最好知道:文件只是文件的名称,而不是文件本身。就像门牌号一样,它告诉你房子的位置,但不代表房子。
因此,您可以像这样使用它:
InputStream is = this.getClass().getResourceAsStream("/data/gmu.mp3");
File fi = new File(is);
告诉我结果:)
解决方案
在导出 jar 之前,请尝试将gmu.mp3
放在源内。
为什么?
导出 jar 时,它会将源文件夹中的所有有趣代码包装起来。 File f = new File("/data/gmu.mp3")
只是将程序指向文件系统中的文件名 gmu.mp3。如果将gmu.mp3
放在源文件夹中并更新 File
构造函数以反映新位置,则mp3
应与所有代码一起包装到 jar 中。
让我知道它是怎么回事-斯科特
java.io.File将jar-ed文件表示为"ThePacked.jar!/path/inside/file.mp3",这在用作文件时会出现问题。
要读取jar-ed文件的内容,您可以从getResourceAsStream(String filename)给出的InputStream中读取。
或
要将该文件用作真正的java.io.File,(我所做的是)从InputStream中读取它并将其复制到jar之外的位置(例如,到临时文件)。