Java中的getResource()方法,及路径相关问题

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的getResource()方法,及路径相关问题相关的知识,希望对你有一定的参考价值。

在Java中需要加载一个文件时,使用getResource()方法进行加载,会报错

[Caused by: java.lang.NullPointerException: Location is required.

这是对.getClass().getClassLoader().getResource()和.getClass().getResource()的理解不够深入的原因。

二者主要区别如下:

  • getClass().getResource(fileName):表示只会在当前调用类所在的同一路径下查找该fileName文件;
  • getClass().getClassLoader().getResource(fileName):表示只会在classpath根目录下(/)查找该文件;
  • fileName如果是前面加“/”,如"/fileName",则表示绝对路径,取/目录下的该文件;
  • 如果是前面没有加“/”,如"fileName",则表示相对路径,取与调用类同一路径下的该文件。
  • getClassLoader()表示/目录,即classpath根目录

如果路径中包含包名 ,getClass().getResource(“com/xxx/1.xml”);

包名的层级使用"/"隔开(正斜杠),而非“.”(半角句号)。

举例:

包com.aaa下有调用类A,需要引用配置文件1.xml:

  1. 配置文件在包com.aaa下
getClass().getResource("1.fxml") ——成功
getClass().getResource("/1.fxml")——失败
getClass().getClassLoader().getResource("1.fxml")——失败
getClass().getClassLoader().getResource("/1.fxml")——失败

第2条失败,原因是使用了绝对路径,路径不正确(/目录下没有该文件)。应为:

getClass().getResource("/com/aaa/1.fxml")
(com前有"/",表示绝对目录,从/目录开始)

第3条失败是因为相对路径不正确,应为:

getClass().getClassLoader().getResource("com/aaa/1.fxml")
(此处注意com前面没有“/”,因为getClassLoader()已经表示/目录)

第4条失败是绝对路径不正确,因为当前已在/目录下,再使用/1.fxml就出错。可以改为如下:

getClass().getClassLoader().getResource("./1.fxml")

2.配置文件在根目录下,

getClass().getResource("1.fxml") ——失败
getClass().getResource("/1.fxml")——成功
getClass().getClassLoader().getResource("1.fxml")——成功
getClass().getClassLoader().getResource("/1.fxml")——失败

第1条是使用相对路径,路径不正确所以失败,应为:

getClass().getResource("../../1.fxml")

第4条失败是因为当前路径已经为/。可以使用:

getClass().getClassLoader().getResource("./1.fxml")

以上是关于Java中的getResource()方法,及路径相关问题的主要内容,如果未能解决你的问题,请参考以下文章

java applicationContext.getResource中的资源路径

java applicationContext.getResource中的资源路径

java applicationContext.getResource中的资源路径

Java:使用getClassLoader.getResource时只能用绝对路径从classpath开始找文件吗?

Java:这个路径用class.getClassLoader().getResource()该怎么写呢?

Class.getResource()和ClassLoader.getResource()异同及用法