放了文件在 resources 目录下,只想拿到它的路径。

参考: java获取resource下的文件路径

详情如下:

String path = xxx.class.getClassLoader().getResource("targetFile.txt").getPath();
java获取文件目录

| ── pom.xml

| ── src

│   |── main

│   │   |── java

│   │   │   |── com

│   │   │   │   |── alipay

│   │   │   │   │   |── ResourceTest.java

│   │   │   │   │   |── Resource.java

│   │   |── resources

│   │   │   |── conf

│   │   │   │   |── sysConf.json

│   │   │   |── request.xml

| ── local.iml
public class ResourceTest {
    public static void main(String[] args) {
        // 1、通过Class的getResource方法
        String a1 = ResourceTest.class.getResource("/com/alipay/Resource.class").getPath();
        String a2 = ResourceTest.class.getResource("Resource.class").getPath();
        String a3 = ResourceTest.class.getResource("/request.xml").getPath();
        String a4 = ResourceTest.class.getResource("../../request.xml").getPath();
        String a5 = ResourceTest.class.getResource("/conf/sysConf.json").getPath();
        String a6 = ResourceTest.class.getResource("../../conf/sysConf.json").getPath();
 
        // 2、通过本类的ClassLoader的getResource方法
        String b1 = ResourceTest.class.getClassLoader().getResource("com/alipay/Resource.class").getPath();
        String b2 = ResourceTest.class.getClassLoader().getResource("request.xml").getPath();
        String b3 = ResourceTest.class.getClassLoader().getResource("conf/sysConf.json").getPath();
 
        // 3、通过ClassLoader的getSystemResource方法
        String c1 = ClassLoader.getSystemClassLoader().getResource("com/alipay/Resource.class").getPath();
        String c2 = ClassLoader.getSystemClassLoader().getResource("request.xml").getPath();
        String c3 = ClassLoader.getSystemClassLoader().getResource("conf/sysConf.json").getPath();
 
        // 4、通过ClassLoader的getSystemResource方法
        String d1 = ClassLoader.getSystemResource("com/alipay/Resource.class").getPath();
        String d2 = ClassLoader.getSystemResource("request.xml").getPath();
        String d3 = ClassLoader.getSystemResource("conf/sysConf.json").getPath();
 
        // 5、通过Thread方式
        String e1 = Thread.currentThread().getContextClassLoader().getResource("com/alipay/Resource.class").getPath();
        String e2 = Thread.currentThread().getContextClassLoader().getResource("request.xml").getPath();
        String e3 = Thread.currentThread().getContextClassLoader().getResource("conf/sysConf.json").getPath();
    }
}

由于maven打包会把 src/main/java 和 src/main/resources 下的文件放到 target/classes 下,所以下面统一以根路径代表此目录,总结起来有以下几个规律:

Class.getResource()的资源获取如果以 / 开头,则从根路径开始搜索资源。
Class.getResource()的资源获取如果不以 / 开头,则从当前类所在的路径开始搜索资源。
ClassLoader.getResource()的资源获取不能以 / 开头,统一从根路径开始搜索资源。