Java音板 - 听起来不便携
Posted
技术标签:
【中文标题】Java音板 - 听起来不便携【英文标题】:Java soundboard - sounds not portable 【发布时间】:2018-04-22 18:17:34 【问题描述】:我对 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】:让我们从这个开始:
new File("C:\\coding\\IntelliJ Workspace\\SwearBall\\src\\sample\\shutUp.wav")
其他计算机在该位置是否有文件?
如果他们不这样做,那么您的程序无法运行也就不足为奇了。事实上,你的程序应该已经产生了一个异常,告诉你文件没有找到。
.jar 文件实际上是一个 zip 文件,其中包含一个或多个 Java 特定条目。由于它只是一个 zip 文件,因此您可以在其中放入任何您想要的附加文件,以及代表您的程序的已编译 .class 文件。这些附加文件称为应用程序资源,有时也称为资源。
zip 文件中的条目不是实际文件,只是 zip 文件中的字节子序列。所以,很明显,作为 zip 文件一部分的东西不能被 File 类引用,因为它不是真正的文件。
将资源与应用程序捆绑在一起是一种常见做法。如此普遍,以至于 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 中的资源。通常该目录类似于:
源/资源 src/main/resources您应该能够通过检查项目的属性找到资源目录。
请记住,资源属于一个包,就像类一样,所以如果您的类在包com.example
中,您可以将您的资源放在相同的树中:
或
src/main/resources/com/example/shutUp.wav如果您在命令行上构建,只需包含您的资源目录:
jar cf MyApplication.jar -C build/classes . -C src/resources .
【讨论】:
感谢您非常彻底的回答。非常感激。我已将声音文件移动到 \src\resourses 并将代码中的路径更改为“src\\resources\\kissMyButt.wav”,而不是特定的驱动器、文件夹等。该应用程序仍然可以在本地运行。我不确定在哪里添加: URL configResource = MyApplication.class.getResource("config.xml");和 AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(getClass().getResource("shutUp.wav"));当按下每个按钮时,我有调用方法来播放每个声音。这都在 Controller 类中。以上是关于Java音板 - 听起来不便携的主要内容,如果未能解决你的问题,请参考以下文章
Java 9 Eclipse 4.7 便携式导出错误“找不到资源”、“无法从给定的启动配置中找到主要方法。”