文件输入流在编译器中工作正常,但在构建后无法正常工作

时间:2012-12-27 00:54:31

标签: java audio netbeans classloader jlayer

我正在尝试使用我刚刚发现的一个整洁的库(JLayer)播放一个mp3文件,并且在使用此代码编译时(在Netbeans中)它可以正常工作:

ClassLoader cl = this.getClass().getClassLoader();
url = cl.getResource("music/45.mp3");
pin = new FileInputStream(url.getFile());
p = new Player(pin);
p.play();

我构建了我的项目并试图运行可执行jar。我扩展了JFrame,所以我可以直观地看到我的程序正在运行。帧在执行时出现,但没有声音。我虽然使用类加载器会解决这个问题,但没有运气。非常感谢帮助!

1 个答案:

答案 0 :(得分:1)

当您拥有可能位于jar文件中的资源时,请不要使用FileInputStream - 使用ClassLoader.gerResourceAsStreamClass.getResourceAsStream。这就是他们的目的。你没有得到磁盘上的单独文件,因此尝试使用FileInputStream毫无意义。

(当然,您可能发现您没有正确使用资源 - 但这是一个单独的问题。)

所以只需使用:

Player p = new Player(getClass().getResourceAsStream("/music/45.mp3"));
p.play();

(从您的代码中看,您似乎比您需要的更早地声明您的变量 - 或者甚至可能将它们声明为逻辑上只是局部变量的字段。值得关注这一点。确保当你真的想要指出类或实例的某种状态时,你只使用字段,并尽可能地声明局部变量 - 理想情况是在初始化时。)