【问题标题】:File Input Stream working fine in compiler, but not working after build文件输入流在编译器中工作正常,但在构建后不工作
【发布时间】:2012-12-27 00:54:31
【问题描述】:

我正在尝试使用我刚刚发现的简洁库 (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,因此我可以直观地看到我的程序正在运行。执行时会出现 Frame,但没有声音。我虽然使用类加载器可以解决这个问题,但没有运气。非常感谢您的帮助!

【问题讨论】:

    标签: java audio netbeans classloader jlayer


    【解决方案1】:

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

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

    所以只需使用:

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

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

    【讨论】:

    • 好吧有道理。只是为了理解 FileInputStream 在这种情况下的功能:假设我要将可执行 jar 放在一个名为“player”的文件夹中,并在“player”中放置另一个名为“media”的文件夹。然后我会让程序在相对位置的 jar 文件之外寻找一个名为“media”的文件夹。那么 FileInputStream 会适用吗?
    • @DillonBurton:不,因为 MP3 资源不是文件。它包含在一个 jar 文件中。 FileInputStream 从磁盘上的文件中读取数据 - 不是嵌入文件的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多