Class.getResource和ClassLoader.getResource 获取资源文件路径

本文详细解析了Java中取资源时Class.getResource与ClassLoader.getResource的区别及路径问题,包括ClassPath与工程根目录的关系,以及如何正确获取指定资源路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.qingyuan.proxy;

import java.io.InputStream;
import java.util.Properties;

import org.junit.Test;

/**
 *  oracle的insert的时候&符号如何插入(转义)
 *  insert into table values( 'http://localhost:8080/index.action?username=138&type=1 '); 
 *  insert into table values( 'http://localhost:8080/index.action?username=138 '||chr(38)|| 'type=1 '); 
 *
 * java.util.Properties --> class Properties extends Hashtable<Object,Object>
 * 
 * file:/C:/Users/workspace/dynTable/WebRoot/WEB-INF/classes/com/qingyuan/proxy/
 * file:/C:/Users/workspace/dynTable/WebRoot/WEB-INF/classes/
 * file:/C:/Users/workspace/dynTable/WebRoot/WEB-INF/classes/com/qingyuan/proxy/
 * file:/C:/Users/workspace/dynTable/WebRoot/WEB-INF/classes/com/qingyuan/proxy/
 * sun.misc.Launcher$AppClassLoader@19821f
 * file:/C:/Users/workspace/dynTable/WebRoot/WEB-INF/classes/
 * 
 * 工程根目录和ClassPath 不是一回事,这里的getResouce说的是ClassPath 而不是工程根目录,也就是bin 目录;
 * src --> webRoot/WEB-INF/classes
 * project -> properites -> javaBuild path -> source
 * source folder on build path: -> default output folder -> specific here
 * src directory resouce going to be listed in WEB-INF/classes
 * 
 * Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题
 * TestMain.class.getResource("/") == t.getClass().getClassLoader().getResource("")
 */
public class ResourcePathChecker
{
    // path不以’/'开头时,默认是从此类所在的包下取资源;
    // path  以’/'开头时,则是从ClassPath根下获取;
    @Test
    public  void testPath() 
    {
        // file:/C:/Users/workspace/dynTable/WebRoot/WEB-INF/classes/com/qingyuan/proxy/
        System.out.println(ResourcePathChecker.class.getResource(""));
        
        // Linux environment "/" as the root directory
        // if your put file in src/, you need use class.getResource("/")
        // file:/C:/Users/workspace/dynTable/WebRoot/WEB-INF/classes/
        System.out.println(ResourcePathChecker.class.getResource("/"));
        
    }

    @SuppressWarnings("unused")
    private static ClassLoader getClassLoader2()
    {
        ResourcePathChecker.class.getClassLoader();
        ResourcePathChecker.class.getResourceAsStream("");
        ResourcePathChecker.class.getClassLoader().getResourceAsStream("");
        // wesConfigFile = getClassLoader().getResourceAsStream("WES_Cfg.properties");
        return new ResourcePathChecker().getClass().getClassLoader();
    }
    
    @SuppressWarnings("unused")
    @Test
    public void getLogChmodPermission() throws Exception
    {
        Properties properties; // Properties + InputStream <输入流对象>
        InputStream wesConfigFile;
        
        properties = new Properties();
        wesConfigFile = ResourcePathChecker.class.getClassLoader().getResourceAsStream("WES_Cfg.properties");
        
        properties.load(wesConfigFile);
        String permissions = properties.getProperty("WF_LOG_CHMOD_PERMISSIONS");
        
        System.out.print(permissions);
    }
    
    // t.getClass().getClassLoader().getResource("/"));//null
    // 记住一点: 如果使用t.getClass().getClassLoader().getResource,就不要用"/"
    @Test
    public void  test() 
    {
        ResourcePathChecker t = new ResourcePathChecker();
        System.out.println(t.getClass().getResource(""));
        System.out.println(t.getClass().getClassLoader());
        System.out.println(t.getClass().getClassLoader().getResource(""));
        System.out.println(t.getClass().getClassLoader().getResource("/")); //null
    }

    public static void main(String[] args) {
        
        // 当前类(class)所在的包目录
        System.out.println(ResourcePathChecker.class.getResource(""));
        
        // class path根目录
        System.out.println(ResourcePathChecker.class.getResource("/"));
        
        // TestMain.class在<bin>/testpackage包中
        // 2.properties  在<bin>/testpackage包中
        System.out.println(ResourcePathChecker.class.getResource("2.properties"));
        
        // TestMain.class在<bin>/testpackage包中
        // 3.properties  在<bin>/testpackage.subpackage包中
        System.out.println(ResourcePathChecker.class.getResource("subpackage/3.properties"));
        
        // TestMain.class在<bin>/testpackage包中
        // 1.properties  在bin目录(class根目录)
        System.out.println(ResourcePathChecker.class.getResource("/1.properties"));
        
        ResourcePathChecker t = new ResourcePathChecker();
        
        System.out.println(t.getClass().getClassLoader().getResource(""));     
        System.out.println(t.getClass().getClassLoader().getResource("1.properties"));
        System.out.println(t.getClass().getClassLoader().getResource("testpackage/2.properties"));
        System.out.println(t.getClass().getClassLoader().getResource("testpackage/subpackage/3.properties"));
    }

   /* 同时多线程Simultaneous multithreading,简称SMT。SMT可通过复制处理器上的结构状态,让同一个处理器上的多个线程同步执行并共享处理器的执行资源,
    可最大限度地实现宽发射、乱序的超标量处理,提高处理器运算部件的利用率,缓和由于数据相关或Cache未命中带来的访问内存延时。当没有多个线程可用时,
    SMT处理器几乎和传统的宽发射超标量处理器一样。SMT最具吸引力的是只需小规模改变处理器核心的设计,几乎不用增加额外的成本就可以显著地提升效能。
    多线程技术则可以为高速的运算核心准备更多的待处理数据,减少运算核心的闲置时间。这对于桌面低端系统来说无疑十分具有吸引力。
    Intel从3.06GHz Pentium 4开始,所有处理器都将支持SMT技术。*/
    
}

<think>好的,我现在需要回答用户关于如何使用ClassLoader.getResource方法从jar包中加载资源的问题。首先,我得回忆一下相关的知识点。用户提到了引用中的几个方法,比如使用ClassLoadergetResource()方法,还有ResourceUtils.getURL(),但用户现在主要关注的是ClassLoader.getResource的使用。 首先,我应该确认ClassLoader.getResource的基本用法。记得这个方法是通过类加载器来查找资源,资源路径需要是类路径下的相对路径。比如,如果资源在jar包的com/example目录下,那么路径应该是"/com/example/resource.txt",不过可能需要不带开头的斜杠?这里容易混淆,需要再查证一下。 然后,用户提到的示例代码可能需要给出具体的步骤。比如,如何获取ClassLoader实例,如何构建资源路径,如何处理返回的URL对象。引用中的例子显示,可以通过当前类的ClassLoader获取资源,比如使用MyClass.class.getClassLoader().getResource("burn/burnhex/hex2bin.exe")。这时候需要注意资源路径是否以斜杠开头,或者是否是相对路径。 接下来,需要解释资源路径的写法。比如,当资源位于jar包的根目录时,直接使用文件名;如果在子目录中,需要使用相对于类路径路径。例如,如果资源在jar包的resources/images目录下,路径应该是"resources/images/image.png"。但要注意,ClassLoader.getResource的参数是否区分绝对相对路径,绝对路径可能需要以斜杠开头,或者不,这可能取决于具体的类加载器实现。根据Java文档,ClassLoadergetResource方法不接受以斜杠开头的路径,而ClassgetResource方法可以处理,如果路径以斜杠开头,则相对于类路径的根目录,否则相对于当前类所在的包。所以这里使用ClassLoader.getResource时,路径应该是不带斜杠的绝对路径,或者相对路径? 例如,引用[2]中的例子是加载"burn/burnhex/hex2bin.exe",没有以斜杠开头,说明使用的是相对于类路径根目录的路径。所以,正确的做法是,资源路径应该相对于类路径的根,即从jar包的根目录开始,但不带前导斜杠。例如,如果资源在jar包的com/example/res目录下,路径应该是"com/example/res/file.txt"。 然后,需要给出一个具体的Java代码示例。比如,获取ClassLoader实例,调用getResource方法,并处理URL。比如: ClassLoader classLoader = MyClass.class.getClassLoader(); URL resourceUrl = classLoader.getResource("com/example/resource.txt"); if (resourceUrl != null) { // 读取资源 } 此外,需要提到如何处理资源可能不存在的情况,比如检查返回的URL是否为null。同时,可能需要解释如何从URL中获取输入流,使用getResourceAsStream方法,但用户的问题是关于getResource的,所以重点在获取URL。 另外,引用[4]中提到,当使用JarLoader时,会按jar包的方式读取资源。所以,当资源被打包进jar后,ClassLoader能够正确找到它,只要路径正确。 总结步骤应该是: 1. 确定资源在jar包中的路径,相对于类路径根目录。 2. 使用ClassLoadergetResource方法传入该路径。 3. 处理返回的URL,可能转换为文件路径或读取内容。 同时需要注意,当资源在jar包中时,通过URL获取路径可能会是jar:file:/path/to.jar!/resource/path这样的形式,不能直接作为文件路径访问,需要使用特定的方法读取,比如通过URL.openStream()。 可能还需要提醒用户,如果资源在jar包中,直接转换为文件路径可能会失败,必须通过流来读取内容。 最后,生成相关问题,比如如何处理资源不存在,如何读取资源内容,路径格式问题等。</think>要使用 `ClassLoader.getResource()` 方法从 JAR 包中加载资源文件,需遵循以下步骤: --- ### **1. 资源路径规范** 资源路径需相对于**类路径根目录**,且**不以前导斜杠开头**。例如: - 若资源位于 JAR 包的 `com/example/resources` 目录下,完整路径应为 `com/example/resources/file.txt`[^3][^4]。 - 若资源在 JAR 包根目录下,直接使用文件名,如 `config.properties`。 --- ### **2. 代码示例** ```java public class ResourceLoader { public static void main(String[] args) { // 获取当前类的 ClassLoader ClassLoader classLoader = ResourceLoader.class.getClassLoader(); // 加载资源文件路径相对于类路径根目录) URL resourceUrl = classLoader.getResource("com/example/config.xml"); if (resourceUrl != null) { System.out.println("资源路径: " + resourceUrl.getPath()); // 示例输出: jar:file:/path/to/your.jar!/com/example/config.xml } else { System.out.println("资源未找到"); } } } ``` --- ### **3. 关键注意事项** - **路径格式**:使用 `/` 作为目录分隔符,且路径需与 JAR 包内结构完全一致[^3]。 - **资源访问方式**:若资源在 JAR 包内,`resourceUrl.getPath()` 返回的路径可能包含 `jar:file:` 前缀,需通过 `InputStream` 读取内容: ```java InputStream inputStream = classLoader.getResourceAsStream("com/example/config.xml"); ``` - **空值检查**:务必检查返回的 `URL` 是否为 `null`,避免资源不存在时抛出异常[^2]。 --- ### **4. 常见问题解决** - **路径错误**:若返回 `null`,检查路径是否与 JAR 包内结构一致,或使用 `jar -tf your.jar` 命令验证。 - **读取资源内容**:通过 `ClassLoader.getResourceAsStream()` 直接获取输入流,无需解析文件系统路径[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值