java - 系统找不到 JAR 中指定的路径
问题描述
我正在尝试播放音频文件。在我的 IDE (intellij) 中完全可以正常工作,但是在 JAR 中运行时,出现错误java.io.FileNotFoundException: D:\soni801\Documents\Redsea Productions\The Great X Wars\alpha-0.0.7.1.jar\audio\click.au (The system cannot find the path specified)
文件在 JAR 中的位置是audio/click.au
,并且 JAR 位于D:\soni801\Documents\Redsea Productions\The Great X Wars\alpha-0.0.7.1.jar
afaik 应该创建绝对路径D:\soni801\Documents\Redsea Productions\The Great X Wars\alpha-0.0.7.1.jar\audio\click.au
的位置,但是系统在该位置找不到文件?这里发生了什么事?
这是我AudioPlayer.java
文件中的代码:
AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath() /*+ "/res"*/ + filePath).getAbsoluteFile());
Clip clip = AudioSystem.getClip();
clip.open(inputStream);
或者,您可以在GitHub 存储库中找到整个文件以及项目的其余部分
感谢所有帮助。
我知道这可能与其他问题重复,但不幸的是其他解决方案没有解决我的问题
如果问题不清楚,请评论我可以做出的任何改进,我将编辑问题
解决方案
该AudioSystem.getAudioInputStream
方法被重载并且可以接受 a File
、 aURL
或 anInputStream
作为参数。其中,URL
通常是最好的选择。
它的优势File
在于 aURL
可以寻址 jar 中的文件,这是 aFile
无法做到的。
它的优势InputStream
在于附加条件:音频文件必须支持mark
和reset
方法。我对音频文件的经验是,这是否可能是一种命中或失败。我承认我不知道具体原因。
要从您的 jar 中获取 URL,最简单的形式可能如下:
URL url = this.getClass().getResource("yourAudioFileName");
这假定音频资源与“this”类在同一个包中。包的子文件夹也可以通过这种方式进行寻址。但我不认为符号“../”可以指望从父文件夹获取资源。
或者,您可以在音频资源的包或父包中指定一个类,而不是“this”。此外,您可以在地址前加上“/”。在最后一种情况下,例如,this.getClass().getResource("/yourAudioFileName")
项目的根源文件夹是地址的起点,而不是包含“this”的包。
推荐阅读
- shell - 使用 go 获取 shell 名称
- jenkins - 在 Jenkins 管道之间共享文件
- mariadb - 升级 MariaDB 时的 SSH 问题
- spring - Class.java:-2 处的 java.lang.NoClassDefFoundError
- ios - NSDateComponents:获取最近的未来日期
- python - 使用 python boto3 在 Route53 中管理具有多个 IP 的 A 记录
- sed - 在终端实例中不遵守下划线
- rabbitmq - 在 RabbitMq 中消费消息的最佳方式是什么?
- linux - Docker 守护进程 Bip 配置
- next.js - 下一个 JS publicRuntimeConfig 没有在运行时设置