使用 Main.class.getResource("notification.wav").getFile() 时找不到文件或语法不正确
file not found or syntax incorrect when using Main.class.getResource("notification.wav").getFile()
我正在尝试播放 .wav 文件,但使用相对路径函数时遇到问题。
public class Main {
public static void main(String[] args) {
playSound();
}
public static void playSound() {
try {
File file = new File(Main.class.getResource("notification.wav").getFile());
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start();
} catch(Exception ex) {
System.out.println("Error playing sound.");
ex.printStackTrace();
}
}
}
如果我在 IntelliJ 中 运行 上面的代码,我收到错误:
java.io.FileNotFoundException: C:\Users\Dominik\Documents\IntelliJ%20Projects\nbbot\out\production\nbbot\com\company\notification.wav (The system cannot find the path specified)
如果我 运行 我构建的 .jar 应用程序,我收到错误:
java.io.FileNotFoundException: file:\C:\Users\Dominik\Documents\IntelliJ%20Projects\nbbot\nbbot_jar\nbbot.jar!\com\company\notification.wav (The filename, directory name, or volume label syntax is incorrect) in Java?
.wav 文件和 Main class,其中我 运行 代码片段在同一文件夹中:
nbbot > src > com > 公司 > Main.java; notification.wav
奇怪,因为路径是正确的,直接读取文件应该没有问题。
我也尝试了 Main.class.getClass().getResource("notification.wav").getFile();
和 .getPath()
但也没有成功。如果我只使用 new File("notification.wav")
并将 .wav 放在项目文件夹 nbbot
中,音频将按预期播放,但仅在 IDE.
中
你的计划失败了。 资源通常不是文件。在资源上调用 .getFile()
通常会破坏代码。例如,当将您的应用程序打包到一个罐子里时,砰的一声,破了。 java.io.File
对象只能代表一个实际文件。
几乎每个 API 还允许您传递 URL 或 InputStream 而不是文件,使用它们 - 这些是适用于所有资源的抽象。
getAudioInputStream
就是这样一种方法,还好。它有 em 的覆盖。写这个:
try (AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(
Main.class.getResource("notification.wav"))) {
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start();
}
这可能会解决这个问题,并且肯定意味着一旦您的文件打包到 jar 中,您的代码将继续工作。
注意:InputStreams 是 必须 关闭的资源,因此,您需要使用 try-with-resources,否则您的应用最终会因 运行 在播放足够多的音频后处理 OS 个句柄。
我正在尝试播放 .wav 文件,但使用相对路径函数时遇到问题。
public class Main {
public static void main(String[] args) {
playSound();
}
public static void playSound() {
try {
File file = new File(Main.class.getResource("notification.wav").getFile());
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start();
} catch(Exception ex) {
System.out.println("Error playing sound.");
ex.printStackTrace();
}
}
}
如果我在 IntelliJ 中 运行 上面的代码,我收到错误:
java.io.FileNotFoundException: C:\Users\Dominik\Documents\IntelliJ%20Projects\nbbot\out\production\nbbot\com\company\notification.wav (The system cannot find the path specified)
如果我 运行 我构建的 .jar 应用程序,我收到错误:
java.io.FileNotFoundException: file:\C:\Users\Dominik\Documents\IntelliJ%20Projects\nbbot\nbbot_jar\nbbot.jar!\com\company\notification.wav (The filename, directory name, or volume label syntax is incorrect) in Java?
.wav 文件和 Main class,其中我 运行 代码片段在同一文件夹中:
nbbot > src > com > 公司 > Main.java; notification.wav
奇怪,因为路径是正确的,直接读取文件应该没有问题。
我也尝试了 Main.class.getClass().getResource("notification.wav").getFile();
和 .getPath()
但也没有成功。如果我只使用 new File("notification.wav")
并将 .wav 放在项目文件夹 nbbot
中,音频将按预期播放,但仅在 IDE.
你的计划失败了。 资源通常不是文件。在资源上调用 .getFile()
通常会破坏代码。例如,当将您的应用程序打包到一个罐子里时,砰的一声,破了。 java.io.File
对象只能代表一个实际文件。
几乎每个 API 还允许您传递 URL 或 InputStream 而不是文件,使用它们 - 这些是适用于所有资源的抽象。
getAudioInputStream
就是这样一种方法,还好。它有 em 的覆盖。写这个:
try (AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(
Main.class.getResource("notification.wav"))) {
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start();
}
这可能会解决这个问题,并且肯定意味着一旦您的文件打包到 jar 中,您的代码将继续工作。
注意:InputStreams 是 必须 关闭的资源,因此,您需要使用 try-with-resources,否则您的应用最终会因 运行 在播放足够多的音频后处理 OS 个句柄。