我遇到了一个涉及 Windows 安装的 audioInputStream、资源文件夹和 nsis 的问题。我正在开发一个应用程序(在 Linux 中),该应用程序在事件发生时执行桌面通知,并且除了通知弹出时应该播放的 .wav 文件外,一切正常。我已经在 64 位 Windows 计算机上测试了该应用程序,无需通过 nsis 安装它,并且它运行良好。我收到一条错误消息,指出:
07/08/13 12:17:26 错误 [Thread-2] (DesktopNotifierMessageAlertHandler.java:73) com.alcatel.proserv.e911.desktopNotifierMessaging.desktopNotifierMessageHandler.DesktopNotifierMessageAlertHandler - 错误:java.io.FileNotFoundException:C:\Program%20Files\Alcatel-Lucent\E911DesktopNotifier\classes\audio\siren.wav(Le chemin d'accès spécifié est introuvable)
我正在 Netbeans 中工作并使用 Maven 进行构建。这是我如何加载路径的代码片段:
String filename = this.getClass().getResource("/audio/siren.wav").getPath();
AudioInputStream audioInputStream = null;
try{
audioInputStream = AudioSystem.getAudioInputStream(new File(filename).getAbsoluteFile());
Clip clip = null;
clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start();
}
...
我发现这个博客详细介绍了如何解决极其相似的问题: http://braintwitter.blogspot.ro/2013/03/url-encoding-issue-with-tomcat.html
但它不适用于我正在使用的audioInputStream。
我知道这是“Program Files”中的空间问题,我必须在其中进行安装,因为当我将 setup.nsi 脚本中的 InstallDir 值从 $PROGRAMFILES64 更改为 $WINDIR 时,它工作得很好。
由于程序文件中的空间导致编码问题,有人对如何修改代码以使其正常工作有任何建议吗?
最佳答案
getResource()
返回一个 URL
,并且它在此处应用了 URL 编码。你有两个选择。您可以转换为 URI
:
String filename = this.getClass().getResource("/audio/siren.wav").toURI().getPath();
或者您可以使用 URLDecoder
来解码路径,然后再将其传递到 AudioInputStream
:
String filename = this.getClass().getResource("/audio/siren.wav").getPath();
filename = URLDecoder.decode(filename, "utf-8");
请参阅介绍部分末尾的简介 java.net.URL
.
关于java - 使用 nsis 打包应用程序安装程序和 .wav 文件无法播放,因为 Windows 上的路径包含空格 --> Program%20Files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18137682/