【问题标题】:Java: I do not Understand the Relative PathsJava:我不了解相对路径
【发布时间】:2020-11-19 13:08:43
【问题描述】:

我有以下 maven 项目结构,也可以在此处 (ProjectStructure) 中看到:

-maws20.algorithm
 |-src/main/resources
   |-images
     |-menuBanner
       |-linearSearchMenuBannerUnsorted.png
 |-src/main/java
   |-linearSearch.menu
     |-LinearSearchMenuBanner.java

我正在尝试使用以下行在 LinearSearchMenuBanner.java-File 中加载该 .png 图像:

@Override
public Image loadBackgroundImage() {
   return new Image(LinearSearchMenuBanner.class.
       getResource("/images/menuBanner/linearSearchMenuBannerUnsorted.png").toString());
}

这不是正确的相对路径吗?因为我收到以下错误:

...
Caused by: java.lang.NullPointerException: Cannot invoke "java.net.URL.toString()" because the return value of "java.lang.Class.getResource(String)" is null
    at linearSearch.menu.LinearSearchMenuBanner.loadBackgroundImage(LinearSearchMenuBanner.java:20)
...

(第20行就是上图的那一行)

我以为我理解 Java 中的相对路径。 ^^'

感谢您的帮助。

【问题讨论】:

  • 尝试从“/images/...”中删除第一个/
  • 带“/”的路径是绝对的,不是相对的。
  • 使用相对路径,您从当前所在的“位置”(位置)开始,忽略上面的内容。也就是说,与你的职位有关,但你可以在上面加上“../”。

标签: java relative-path


【解决方案1】:

去掉第一个反斜杠/,实际上是绝对路径而不是相对路径。 试试这个:

@Override
public Image loadBackgroundImage() {
    File resource = new ClassPathResource("images/menuBanner/linearSearchMenuBannerUnsorted.png").getFile();
    return new Image(new String(Files.readAllBytes(resource.toPath()));
}

想了解更多,可以访问这个链接:spring-classpath-file-access

【讨论】:

  • 感谢您的回答。我仍然得到同样的错误。 :(
  • 更新了答案。让我知道这个是否奏效? @Schrello
  • 嘿,如果我使用 Spring.Framework,那么我得到 'java.io.FileNotFoundException: class path resource [images/menuBanner/linearSearchMenuBannerUnsorted.png] 无法解析为 URL,因为它不存在' (我怎样才能将 sth. 格式化为注释部分中的代码?)为什么 URL 不存在?它就在那里。
  • Yes.. 我还尝试使用绝对路径,例如:“F:\\Eigene Daten\\....\\images\\menuBanner\\linearSearchMenuBannerUnsorted.png” 仍然收到消息,即 URL 不存在。我认为其他东西似乎坏了。
【解决方案2】:

感谢您的所有帮助。我不知道出了什么问题,但是当我创建一个全新的工作区之后,创建所有新文件并将源代码复制到新文件中。然后就可以正常使用了。

不知道为什么……

但是非常感谢你:)

【讨论】:

    【解决方案3】:

    我猜这与您的包装有关。图像需要在服务器文件系统上,JAR 资源将不起作用!

    ClassPathResource

    Supports resolution as java.io.File if the class path resource resides in the file system, but not for resources in a JAR. Always supports resolution as URL.
    

    你在包search.menu中,你需要访问images/menuBanner中的文件资源所以你需要加载一个资源:

    new ClassPathResource(“../../images/menuBanner/linearSearchMenuBannerUnsorted.png
    “, LinearSearchMenuBanner
    .class).getFile();
    

    看看这里的其他选项: https://www.baeldung.com/spring-classpath-file-access

    【讨论】:

    • 感谢您的回答。但它仍然应该与 .class.getResource("images/menuBanner/linearSearchMenuBannerUnsorted.png").toString());不应该吗?
    • @Schrello:我认为这个答案最接近解决方案。其他答案似乎对文件系统上的绝对路径和类路径上的绝对路径之间的区别感到困惑。你的路在我看来是正确的。
    • @Schrello: Class.getResource 在存储类文件的同一位置查找正在运行的应用程序的资源。您是否已验证该图像文件在该位置可用? (那个地方应该是jar文件或者bin目录,在Eclipse中可能是<project name>/bin。)
    • 谢谢...为什么它不能与 getRessource() 一起使用?为什么它根本不起作用? :(
    • @Schrello 加载资源取决于 ClassLoader。理解 ClassLoaders 的机制是这方面的关键。使用 ClassLoader,您可以控制发生的事情,并可以进行插件沙盒等。通常它有一个安全方面。您可以尝试使用 URL,因为这应该始终有效,并且如果设置正确,则更容易测试。您还可以强制使用专用的 ClassLoader(只有在您知道自己在做什么的情况下才这样做 - 在最坏的情况下,您可能会在您的应用中创建安全漏洞)。
    猜你喜欢
    • 2014-02-04
    • 2017-04-19
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多