2012-12-27 31 views
0

我正在尝试使用我刚发现(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

当您的资源可能位于jar文件中时,请勿使用FileInputStream - 请使用ClassLoader.gerResourceAsStreamClass.getResourceAsStream。这就是他们在那里。你还没有得到在磁盘上的一个单独的文件,所以它是没有意义的尝试使用它FileInputStream

(当然,你可以发现你没有将提供适当的资源 - 但那是另外一个问题。)

所以只需使用:

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

(从你代码,它看起来就像比你所需要的更早地声明你的变量 - 或者甚至可能把它们声明为字段,当它们在逻辑上只是局部变量时,值得关注的是,确保你只在你使用字段时真的想指示类或实例的某些状态,并声明局部变量尽可能晚 - 理想情况下是在初始化阶段。)

+0

好吧有道理。为了理解FileInputStream在这种情况下的功能:假设我将可执行jar放在一个名为“player”的文件夹中,并将另一个文件夹放在“player”中称为“media”。然后,我会让该程序在相对位置的jar文件之外寻找名为“media”的文件夹。 FileInputStream会适用于那么? –

+1

@DillonBurton:不,因为MP3资源*不是文件*。它包含在一个jar文件中。 'FileInputStream'从磁盘上的文件中读取数据 - 不是*文件内嵌入的东西。 –

+0

好吧,真的清除了事情。谢谢,先生,+1。 –

相关问题