Java 通过相对路径访问包外的文件以作为图像加载 (JavaFX)
Java Access File Outside of Package via Relative Path to load as Image (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 文件夹中时(给定路径已适当更改),它也能正常工作。
我的当前活动 class Menu.java
在包 test.dsp
中,它在项目中的位置为:
project/src/test/dsp/Menu.java
我试图访问的文件:
project/assets/graphics/test/dsp/sslogo.png
我假设此路径是相对于 Menu.java
中的当前 Menu
class 并且由于物理目录是 project/src/test/dsp/Menu.java
,我在我的相对路径中执行了三次 ../
以到达项目目录。然后我简单地把图片的路径放在下面。
Image ssLogo = new Image("../../../assets/graphics/test/dsp/sslogo.png",
2000, 2000, true, true);
I am basing my knowledge off of the constructor described in the JavaFX API:
public Image(java.lang.String url,
double requestedWidth,
double requestedHeight,
boolean preserveRatio,
boolean smooth)
url - the string representing the URL to use in fetching the pixel data
我已经搜索了过多的问题,但他们的答案并没有提供使我当前的案例有效的解决方案。我试过 getResource、getResourceAsStream 和外部资源。我检查了通过这些方式返回的 URL 并且 none 使用我提供的路径,如上所示。我也尝试了不同数量的../
,仍然没有用。不可否认,我可能实施错误,导致没有成功。
为什么这种通过相对路径访问文件的方法不起作用,我怎样才能使它与我当前的目录设置一起工作?
一般来说,在 java 中通过相对路径访问文件的正确方法是什么?特别是当文件在包外时,例如这种情况?
- 有没有办法通过 java class 中的代码将文件包含到文件路径中?
将文件放在包内效率更高,还是无所谓(显然取决于在包外访问文件的方式)?
- 是否有更有效的文件访问方式java?
java 中的相对路径从项目的根目录开始(在您的例子中是 "project" 目录),而不是 class,其中 url叫。所以你的 png 文件的相对路径是 "assets/graphics/test/dsp/sslogo.png".
一般包对相对路径没有影响。
更有效的方法是像您一样将图像和其他 static 文件保存在不同的目录中。 "src" 文件夹是为 .java 个文件保留的。
更新:
如 post 所述:
如果您不在 URL 的开头使用 http: 或 file:将在(默认)包中搜索资源。因此,在您的情况下,获取文件的好方法是使用以下行:
Image ssLogo = new Image("file:assets/graphics/test/dsp/sslogo.png", 2000, 2000, true, true);
我正在尝试用 JavaFX 制作一个简单的菜单。当我尝试使用相对路径加载图像时,我收到以下异常:
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1110)
我正在使用 Eclipse,尽管这个问题似乎不是 Eclipse 特有的,因为在终端中 运行 时我收到了相同的异常。此外,出于某种原因,当文件位于包内或 src 文件夹中时(给定路径已适当更改),它也能正常工作。
我的当前活动 class Menu.java
在包 test.dsp
中,它在项目中的位置为:
project/src/test/dsp/Menu.java
我试图访问的文件:
project/assets/graphics/test/dsp/sslogo.png
我假设此路径是相对于 Menu.java
中的当前 Menu
class 并且由于物理目录是 project/src/test/dsp/Menu.java
,我在我的相对路径中执行了三次 ../
以到达项目目录。然后我简单地把图片的路径放在下面。
Image ssLogo = new Image("../../../assets/graphics/test/dsp/sslogo.png",
2000, 2000, true, true);
I am basing my knowledge off of the constructor described in the JavaFX API:
public Image(java.lang.String url,
double requestedWidth,
double requestedHeight,
boolean preserveRatio,
boolean smooth)
url - the string representing the URL to use in fetching the pixel data
我已经搜索了过多的问题,但他们的答案并没有提供使我当前的案例有效的解决方案。我试过 getResource、getResourceAsStream 和外部资源。我检查了通过这些方式返回的 URL 并且 none 使用我提供的路径,如上所示。我也尝试了不同数量的../
,仍然没有用。不可否认,我可能实施错误,导致没有成功。
为什么这种通过相对路径访问文件的方法不起作用,我怎样才能使它与我当前的目录设置一起工作?
一般来说,在 java 中通过相对路径访问文件的正确方法是什么?特别是当文件在包外时,例如这种情况?
- 有没有办法通过 java class 中的代码将文件包含到文件路径中?
将文件放在包内效率更高,还是无所谓(显然取决于在包外访问文件的方式)?
- 是否有更有效的文件访问方式java?
java 中的相对路径从项目的根目录开始(在您的例子中是 "project" 目录),而不是 class,其中 url叫。所以你的 png 文件的相对路径是 "assets/graphics/test/dsp/sslogo.png".
一般包对相对路径没有影响。
更有效的方法是像您一样将图像和其他 static 文件保存在不同的目录中。 "src" 文件夹是为 .java 个文件保留的。
更新:
如 post 所述:
如果您不在 URL 的开头使用 http: 或 file:将在(默认)包中搜索资源。因此,在您的情况下,获取文件的好方法是使用以下行:
Image ssLogo = new Image("file:assets/graphics/test/dsp/sslogo.png", 2000, 2000, true, true);