Java 文件输入流在编译器中工作正常,但在生成后不工作
我正在尝试使用我刚刚发现的一个整洁的库(JLayer)播放mp3文件,使用以下代码编译(在Netbeans中)时效果良好:Java 文件输入流在编译器中工作正常,但在生成后不工作,java,audio,netbeans,classloader,jlayer,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。我扩展了J
ClassLoader cl = this.getClass().getClassLoader();
url = cl.getResource("music/45.mp3");
pin = new FileInputStream(url.getFile());
p = new Player(pin);
p.play();
我构建了我的项目并尝试运行可执行jar。我扩展了JFrame,以便可以直观地看到我的程序正在运行。帧在执行时出现,但没有声音。我认为使用类加载器可以解决这个问题,但运气不好。非常感谢您的帮助 当您拥有jar文件中的资源时,不要使用
FileInputStream
——使用ClassLoader.gerresourceastream
或Class.getresourceastream
。这就是他们在那里的目的。磁盘上没有单独的文件,因此尝试使用FileInputStream
是毫无意义的
(当然,您可能会发现您没有正确地提供资源,但这是另一个问题。)
所以只要使用:
Player p = new Player(getClass().getResourceAsStream("/music/45.mp3"));
p.play();
(从您的代码来看,您似乎比需要更早地声明了变量,或者甚至可能在逻辑上应该是局部变量时将其声明为字段。值得注意的是,请确保仅在确实希望指示类或实例的某些状态时才使用字段,并声明局部变量(最好是在初始化的时候。)确定是有意义的。只是为了了解FileInputStream在这种情况下的功能:假设我将可执行jar放在一个名为“player”的文件夹中,并将另一个文件夹放在名为“media”的“player”中。然后我会让程序查找一个名为“media”的文件夹在jar文件之外的相对位置。FileInputStream是否适用?@DillonBurton:不,因为MP3资源不是文件。它包含在jar文件中。
FileInputStream
从磁盘上的文件读取数据,而不是嵌入在文件中的内容。