我对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();
}
}
答案 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的getResource和getResourceAsStream方法。
将资源放在类似于包的目录中非常重要。非常重要的是,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中。通常该目录类似于:
您应该可以通过检查项目的属性来查找资源目录。
请记住,资源属于一个包,就像类一样,所以如果你的类在包com.example
中,你可以将资源放在一个相同的树中:
或
如果您在命令行上构建,只需包含资源目录:
jar cf MyApplication.jar -C build/classes . -C src/resources .