Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java通过相对路径访问包外的文件以加载为映像(JavaFX)_Java_Image_File_Javafx_Classpath - Fatal编程技术网

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

Java通过相对路径访问包外的文件以加载为映像(JavaFX),java,image,file,javafx,classpath,Java,Image,File,Javafx,Classpath,我正在尝试用JavaFX制作一个简单的菜单。当我尝试使用相对路径加载图像时,我收到以下异常: Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found at javafx.scene.image.Image.validateUrl(Image.java:1110) 我正在使用eclipse,尽管这个问题似乎不是特定于eclipse的,因为我在终端中运行时收到了相同的异常。此外,由于某些原

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

Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
  at javafx.scene.image.Image.validateUrl(Image.java:1110)
我正在使用eclipse,尽管这个问题似乎不是特定于eclipse的,因为我在终端中运行时收到了相同的异常。此外,由于某些原因,当文件位于包内部或src文件夹中时(给定的路径已适当更改),它也会工作

我当前的活动类
菜单.java
位于包
test.dsp
中,该包位于项目中,如下所示:

project/src/test/dsp/Menu.java

我试图访问的文件:

项目/资产/图形/测试/dsp/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);

url—表示用于获取像素数据的url的字符串

我已经搜索了大量的问题,但他们的答案并不能为我当前的案例提供解决方案。我尝试了getResource、getResourceAsStream和外部资源。我检查了通过这些方法返回的URL,没有一个使用我提供的路径,如上所示。我还尝试了不同数量的
。/
,但仍然无效。诚然,我可能错误地实施了它们,但没有取得任何成功

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

  • 在java中,通常通过相对路径访问文件的正确方法是什么?特别是当文件位于包之外时,例如本例

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

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

java中的相对路径从项目的根目录(在您的例子中是“项目”目录)开始,而不是从调用url的类开始。因此,png文件的相对路径是“assets/graphics/test/dsp/sslogo.png”

通常,包对相对路径没有影响

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


更新:

正如那篇文章所说:

如果在URL的开头不使用http:或file:之类的协议,则将在(默认)包中搜索资源。因此,在您的情况下,获取文件的好方法是使用以下行:

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

我已经试过了,但没有成功。有什么理由不起作用吗?也许我遗漏了一些非常简单的东西,但我已经测试过了,它不起作用。想一想为什么,会有帮助的。下面的代码:Image-ssLogo=新图像(“assets/graphics/test/dsp/ssLogo.png”,20002000,true,true);当然,我的问题是重复的。我想知道为什么我没有找到那个问题…><使用:“file:assets/graphics/test/dsp/sslogo.png”可以解决这个问题。但我仍然不理解,希望得到一些澄清/确认:因此,通过使用URL字符串开头的“file:”,路径将相对于项目根目录,在本例中为“project”,对吗?如果URL字符串是w/o file:或http:,那么它会在“default”包中搜索?即使我没有使用默认软件包?或者您是指类的包?当您使用file:protocol时,路径是计算机的本地路径,可以是相对路径,也可以是绝对路径(例如:“file:c:/users/Quentin/Desktop/myImage.png”或“file:resources/images/myImage.png”)。对于相对路径,它将相对于项目根目录。使用http:protocol,您可以在web上获取图像,但我认为可以使用其他协议。如果不使用协议(例如:“resources/images/myImage.png”),则路径将相对于默认包。在没有协议的情况下,可以在“project/src/assets/graphics/test/dsp/sslogo.png”中搜索图像,这是一个很好的解释昆汀:D谢谢你。还有一个问题,访问文件的一种方式比另一种方式在效率或时间上更好吗?没有关系。Project不是默认的包。我相信在这种情况下,这将是src。由于资产不是src的一部分,因此无法通过其他方法访问它。我想我现在明白了。
Image ssLogo = new Image("file:assets/graphics/test/dsp/sslogo.png", 2000, 2000, true, true);