Java class.getRessource().getPath() 在 URL 的开头添加了一个奇怪的'/'



我想在SWT中加载一个字体。我的ttf文件位于我的Maven项目的resources/fonts目录中。我试着这样加载:

URL fontURL = MyClass.class.getResource("/fonts/myfont.ttf");
boolean fontLoaded = display.loadFont(fontURL.getPath());

但是得到的布尔值总是false。我试图提示fontURL.getPath()的结果,它有点像/C:/Users/myuser/Documents/...。如果我将这个结果复制到String中,删除第一个/并尝试用它调用display.loadFont(),它就可以工作了。

另一件奇怪的事情是,这并不是我以这种方式加载的唯一资源。例如,这就是我加载窗口图标的方式:

URL iconURL = MyClass.class.getResource("/images/myicon.png");
Image icon = new Image(display, iconURL.getPath());
shell.setImage(icon);

而且效果很好。唯一存在问题的文件是字体文件。有人知道为什么吗?

/在开头的原因是URL类的getPath返回由RFC 2396定义的URL路径(请参阅javadocs(。

至于为什么它对Image构造函数有效而对loadFont()方法无效,可以在实现中找到答案。构造函数使用内部规范化路径的FileInputStream,而loadFont()有一个用于加载的本机实现,它不支持这种路径。

由于在这两种情况下都需要一个文件路径,所以您要做的是使用File构造函数或Paths.get(url.toURI()).toString()方法自己规范化路径。

相关内容

最新更新