Java音板 - 声音不便携

时间:2018-04-22 18:17:35

标签: java audio jar wav

我对Java很新。我制作了一个小音板,但我只是复制了播放.wav文件的部分。这些应用程序在我自己的计算机上运行良好,但当我将其包装到.jar并将其移动到另一台计算机时,声音无法播放。我在网上看到我需要使用“getResourceAsStream”,但我不知道如何在我的特定代码中实现它。 感谢

public void playShutup() {
        try {
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:\\coding\\IntelliJ Workspace\\SwearBall\\src\\sample\\shutUp.wav").getAbsoluteFile());
            Clip clip = AudioSystem.getClip();
            clip.open(audioInputStream);
            clip.start();
        } catch (Exception ex) {
            System.out.println("Error with playing sound.");
            ex.printStackTrace();
        }
    }

1 个答案:

答案 0 :(得分:0)

让我们从这开始:

new File("C:\\coding\\IntelliJ Workspace\\SwearBall\\src\\sample\\shutUp.wav")

其他计算机是否在该位置有文件?

如果他们不这样做,那么你的程序不起作用就不足为奇了。实际上,您的程序应该生成一个异常,告诉您该文件未找到。

<。> .jar文件实际上是一个zip文件,其中包含一个或多个特定于Java的条目。由于它只是一个zip文件,因此您可以在其中添加所需的任何其他文件,以及代表您的程序的已编译的.class文件。这些附加文件称为应用程序资源,有时仅称为资源。

zip文件中的条目不是实际文件,只是zip文件中字节的子序列。因此,显然,使用File类不能引用zip文件的一部分,因为,它实际上并不是一个文件。

将资源与应用程序捆绑是一种常见做法。很常见的是,Java的设计者认为包含一些简单的方法来阅读这些资源会很有用。您可以使用Java的zip类来查找它,但有一种更简单的方法:Class的getResourcegetResourceAsStream方法。

将资源放在类似于包的目录中非常重要。非常重要的是,Class.getResource和Class.getResourceAsStream 默认使用它。意思是,如果你有一个名为com.example.MyApplication的类,它将在你的.jar中存在:

com/example/MyApplication.class

因此,如果您有一个名为config.xml的资源,您可以将其添加到.jar中:

com/example/config.xml

这允许您编写以下代码:

URL configResource = MyApplication.class.getResource("config.xml");
好又干净,不是吗?在你的情况下,你可以写:

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(
    getClass().getResource("shutUp.wav"));

至于如何在.jar文件中包含shutUp.wav,这将取决于您构建应用程序的方式。每个IDE(如Netbeans,Eclipse,IntelliJ等)都希望项目中的特定目录(当前可能存在或可能不存在)包含资源,这些资源在构建时将放置在.jar中。通常该目录类似于:

  • 的src /资源
  • 的src /主/资源

您应该可以通过检查项目的属性来查找资源目录。

请记住,资源属于一个包,就像类一样,所以如果你的类在包com.example中,你可以将资源放在一个相同的树中:

  • 的src /资源/ COM /示例/ shutUp.wav

  • 的src /主/资源/ COM /示例/ shutUp.wav

如果您在命令行上构建,只需包含资源目录:

jar cf MyApplication.jar -C build/classes . -C src/resources .