Java访问包外的文件,通过相对路径加载为图像(JavaFX)



我正在尝试用JavaFX制作一个简单的菜单。当我尝试使用相对路径加载图像时,我会收到以下异常:

Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
  at javafx.scene.image.Image.validateUrl(Image.java:1110)

我正在使用eclipse,尽管这个问题似乎不是eclipse特有的,因为我在终端中运行时收到了同样的异常。此外,由于某些原因,当文件位于包内或src文件夹中时(给定的路径会适当更改),它也能工作。

我当前的活动类Menu.java在包test.dsp中,该包位于项目中,名称为:

project/src/test/dps/Menu.java

我试图访问的文件:

项目/资产/图形/测试/dps/sslogo.png

我试图访问该文件,假设该路径是相对于Menu.java中的当前Menu类的,并且由于物理目录是project/src/test/dsp/Menu.java,我在我的相对路径中实现了三次../以到达项目目录。然后我简单地把路径的图像如下所示。

Image ssLogo = new Image("../../../assets/graphics/test/dsp/sslogo.png",
            2000, 2000, true, true);

我的知识基于JavaFX API中描述的构造函数:

public Image(java.lang.String url,
     double requestedWidth,
     double requestedHeight,
     boolean preserveRatio,
     boolean smooth)

url-表示在提取像素数据时使用的url的字符串

我搜索了很多问题,但他们的答案并不能解决我目前的问题。我尝试过getResource、getResourceAsStream和外部资源。我检查了通过这些方式返回的URL,但没有一个能使用我提供的路径,如上所示。我也尝试了不同数量的../,但仍然没有效果。诚然,我可能错误地执行了它们,导致了失败。

  • 为什么这种通过相对路径访问文件的方法不起作用,以及如何在设置当前目录的情况下使其起作用?

  • 在java中,通过相对路径访问文件的正确方法是什么?特别是当文件在包之外时,比如这种情况?

    • 有没有一种方法可以通过java类中的代码将文件包含到文件路径中
  • 将文件放在包内更有效,还是无关紧要(显然取决于访问包外文件的方式)?

    • 有没有更有效的方法通过java访问文件

java中的相对路径从项目的根目录(在您的情况下是"project"目录)开始,而不是从调用url的类开始。因此,你的png文件的相对路径将是"assets/graphics/test/dsp/ssrogo.png"。

通常情况下,包对相对路径没有影响。

更有效的方法是将图像和其他静态文件保存在不同的目录中。"src"文件夹是为.java文件保留的。


更新:

正如帖子中所说:https://stackoverflow.com/a/16122215/6629388

如果您没有在URL的开头使用http:file:

Image ssLogo = new Image("file:assets/graphics/test/dsp/sslogo.png", 2000, 2000, true, true);

最新更新