文件路径中的斜杠字符在javafx媒体中创建异常

文件路径中的斜杠字符在javafx媒体中创建异常,java,audio,javafx,Java,Audio,Javafx,在这个论坛上,我发现了很多关于这个话题的类似问题,但是这些问题的解决方案都不适合我,这个问题真的让我很沮丧 我有以下方法,当我调用它时,它应该播放一个wav文件。 wav文件的目录是:ProjectFolder/src/resources/Sounds/click.wav public static void Click() { String clickSound = "/resources/Sounds/click.wav"; Media hit = new

在这个论坛上,我发现了很多关于这个话题的类似问题,但是这些问题的解决方案都不适合我,这个问题真的让我很沮丧

我有以下方法,当我调用它时,它应该播放一个wav文件。 wav文件的目录是:ProjectFolder/src/resources/Sounds/click.wav

public static void Click()
{          
    String clickSound = "/resources/Sounds/click.wav";
    Media hit = new Media(new File(clickSound).toPath().toString());
    MediaPlayer mediaPlayer = new MediaPlayer(hit);
    mediaPlayer.play();
}
但它会导致以下例外情况:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: java.net.URISyntaxException: Illegal character in path at index 0: \resources\Sounds\click.wav
    at javafx.scene.media.Media.<init>(Media.java:385)
线程“AWT-EventQueue-0”java.lang.IllegalArgumentException:java.net.URISyntaxException:index 0:\resources\Sounds\click.wav路径中的非法字符
在javafx.scene.media.media.(media.java:385)
当我设置字符串clickSound“resources/Sounds/click.wav”而不是“/resources/Sounds/click.wav”的值时,异常显示索引9的路径中存在非法字符

所以我猜它认为“/”字符是非法字符。我试着用“\”而不是“/”,但结果是一样的

由于某些原因,我不想更改wav文件的位置。如何从ProjectFolder/src/resources/Sounds/click.wav访问该wav文件并毫无例外地播放

感谢您的任何帮助。 提前感谢。

如中所述:

源必须表示有效的URI,并且是不可变的。仅支持HTTP、HTTPS、文件和JAR URL。如果提供的URL无效,则将引发异常

您正在传递文件的路径,而不是URI

无论如何,你几乎肯定不想要这里的文件;例如,当您部署应用程序时,它通常会作为一个jar文件部署,而媒体将是该jar文件中的一个条目(因此它本身根本不是一个文件)。除此之外,
resources
文件夹通常是源代码结构的一部分,并且由于明显的原因,源代码通常在运行时不可用

假设您的资源被部署到类路径的根目录(这是通常的设置),您需要

String clickSound = "/Sounds/click.wav";

Media hit = new Media(getClass().getResource(clickSound).toExternalForm());

您在目录“ProjectFolder/src/resource/Sounds/click.wav”中列出了该文件,但在尝试访问时,您使用的是“resources”而不是“resource”

如果您提供完整路径,是否有效?你知道它运行的文件夹吗?我尝试使用wav文件的完整路径,它导致了同样的非法字符异常@phflackIt不要紧,如果您使用
\
/
,因为您的操作系统似乎使用
\
作为路径分隔符,因此会替换路径中导致无效URI的任何
/
,这是一个键入错误。谢谢你的回答。问题是,我不能从静态上下文引用getClass()方法,我必须从静态上下文调用Click()方法,或者保持Click()方法静态@詹姆斯_D@user8544110所以只需执行
MyClass.class.getResource(…)
而不是
getClass().getResource(…)
,其中
MyClass
是当前类的名称。(但将该方法设置为静态几乎肯定是一个糟糕的设计,因为从某种松散的意义上讲,它看起来应该位于控制器中。)非常感谢您的帮助和建议。终于成功了@詹姆斯·杜德