Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文件输入流在编译器中工作正常,但在生成后不工作_Java_Audio_Netbeans_Classloader_Jlayer - Fatal编程技术网

Java 文件输入流在编译器中工作正常,但在生成后不工作

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

我正在尝试使用我刚刚发现的一个整洁的库(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,以便可以直观地看到我的程序正在运行。帧在执行时出现,但没有声音。我认为使用类加载器可以解决这个问题,但运气不好。非常感谢您的帮助

当您拥有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
从磁盘上的文件读取数据,而不是嵌入在文件中的内容。