getResource()方法的使用以及路径问题

Class.getResource()方法详解:路径选择与常见误区,
本文详细解释了Class类中getResource()方法的两种调用方式,区分了通过类加载器和当前类路径的差异,以及如何正确处理绝对和相对路径,以避免NullPointerException。

getResource()方法是Class类中的一个获取文件的方法,我在使用该方法稍微不注意经常会出现如下报错

Exception in thread "main" java.lang.NullPointerException

 因此我觉得还是有必要写一篇博客来梳理以下该方法的误区、盲点。


首先getResource()方法可以通过getClass().getClassLoader().getResource()和getClass().getResource()两种方式调用,这两种方式调用的区别在于

getClass().getClassLoader().getResource():这个方法是通过类加载器来加载资源的。它从类路径的根目录开始搜索资源。 返回的 URL 是绝对路径,不受调用类的包所影响。

getClass().getResource():这个方法是通过当前类的 class 文件所在的位置作为相对路径来搜索资源的。 返回的 URL 是相对路径,受调用类的包的影响。

总结来说就是

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

比如说在com/***/A包下存在一个文本文件,那么在同一文件夹下的类获取该资源的方法如下

clazz.getClass().getResource("1.text");//相对路径获取
clazz.getClass().getResource("/com/***/A/1.text");//绝对路径获取
clazz.getClass().getClassLoader().getResource("com/***/A/1.text");//com前不需要加“/”

 而不同包的类获取该资源,比如说com/***/B包下的类获取,则需要填写如下获取路径

clazz.getClass().getResources("../A/1.text");
clazz.getClass().getResources("/com/***/A/1.text");
clazz.getClass().getClassLoader().getResources("com/***/A/1.text");
Java中,`getResource()` 方法通常用于从类路径(classpath)中加载资源文件。然而,它并不会直接返回JDK的安装路径或JRE路径。相反,它会根据资源名称查找并返回一个 `URL` 对象,指向该资源的位置。如果目标资源不存在,则返回 `null` [^3]。 要获取JDK或JRE的安装路径,可以使用系统属性而不是依赖于 `getResource()` 方法。例如,可以通过以下方式获取JDK/JRE的安装目录: ```java String javaHome = System.getProperty("java.home"); System.out.println("Java Home: " + javaHome); ``` 这段代码将输出当前运行时环境的 `java.home` 属性,即JRE的安装路径。如果是通过JDK运行程序,那么这个路径通常是JDK下的 `jre` 文件夹路径。 ### 使用 getResource() 获取资源路径 虽然 `getResource()` 不是用来获取JDK路径方法,但它确实经常被用来获取类路径中的资源位置。比如: ```java URL resourceUrl = MyClass.class.getResource("/my/package/resource.txt"); if (resourceUrl != null) { System.out.println("Resource Path: " + resourceUrl.getPath()); } ``` 上述代码尝试获取位于类路径根目录下 `/my/package/resource.txt` 的资源,并打印其路径。需要注意的是,这里的路径是相对于类路径而言的,并不涉及JDK本身的安装路径 [^1]。 ### 总结 - **获取JDK路径**:推荐使用 `System.getProperty("java.home")`。 - **获取类路径中的资源路径**:可使用 `Class.getResource()` 或 `ClassLoader.getResource()`,但这两者主要用于访问类路径内的资源,而非系统级的文件路径 [^1]。 如果你的应用需要与JDK特定的功能交互,或者需要知道编译器的位置,则可能需要检查 `tools.jar` 和 `dt.jar` 等JDK特有的库文件所在路径,这些通常位于JDK安装目录下的 `lib` 子目录中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zmbwcx2003

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值