项目资源路径分两种:

1、普通Java项目的资源路径

2、JavaEE项目的资源路径

  • 获取Java项目的包(源码下的包 或者 jar包)的资源路径
// 方法1:通过this.getClass().getResoure("")获取, 有"/"开头表示以bin目录为根目录, 没"/"开头表示以当前文件夹为根目录   
this.getClass().getResource("/").getFile();  
          
// 方法2:通过this.getClass().getClassLoader().getResource(""), 不允许以"/"开头, 默认以bin目录为根, 类似方法1中以"/"开头的情况  
this.getClass().getClassLoader().getResource("").getFile();  
          
// 方法3:通过ClassLoader.getSystemResource("")获取, 不允许以"/开头", 默认以bin目录为根, 同上  
ClassLoader.getSystemResource("").getFile();  
          
// 方法4:通过Thread.currentThread().getContextClassLoader().getResource("")获取, 同上【推荐】  
Thread.currentThread().getContextClassLoader().getResource("").getFile();  
          
// 方法5:通过new File("bin").getCanonicalPath()获取, 有"/"开头, 则以系统盘为根, 没"/"开头, 表示以bin目录为根   
new File("bin").getCanonicalPath();  
          
// 方法6:通过System.getProperty("user.dir") + File.separator + "bin"来获取(不推荐)  
System.getProperty("user.dir") + File.separator + "bin";

       据说方法4的系统兼容性最好,所以推荐第4种方法获取资源路径。 

  • 获取JavaEE项目的资源路径
// getRealPath()方法中的参数, 是否以"/"开头效果都是一样的, 都是以WEB-INF目录的父目录为根目录进行查找  
request.getServletContext().getRealPath("");

总结:

        1、通过getClassLoader().getResource()的方法, 只能获取package(包括jar包的资源)里面的资源。

        2、若想获取项目下普通目录的资源,可以通过new File(path)的方式获取,路径默认以项目路径为根,以bin开始表示获取bin目录,以src开始表示获取src目录,以XXX开始表示获取项目下XXX目录,该方法最灵活,就算是JavaEE项目同样适用(例如WecContent,可以使用new File("WebContent")获取),唯一缺点就是不能获取jar里面的资源(因为jar包的资源不是以普通File的形式存储的)。

方式1:Class.getResource(String path)方法获取URI,URI调用getPath()方法。

public static void main(String[] args) {
        URL url1 = FileOperateUtil.class.getResource("");
//        URL url1 = new FileOperateUtil().getClass().getResource("");
        // 返回当前类所在路径
        System.out.println(url1.getPath());

        URL url2 = FileOperateUtil.class.getResource("/");
        // 返回当前项目target包classes所在路径
        System.out.println(url2.getPath());

        URL url3 = FileOperateUtil.class.getResource("./");
        // 返回当前类所在路径
        System.out.println(url3.getPath());

        URL url4 = FileOperateUtil.class.getResource("/application.yml");
        // 返回当前类所在路径
        System.out.println(url4.getPath());

        URL url5 = FileOperateUtil.class.getResource("./test.txt");
        // 报NullPointerException,因为class文件同级目录下并无该文件
        System.out.println(url5.getPath());
    }

代码结果:

/D:/BaiduNetdiskDownload/summary/utils/target/classes/com/ryxxtd/util/
/D:/BaiduNetdiskDownload/summary/utils/target/classes/
/D:/BaiduNetdiskDownload/summary/utils/target/classes/com/ryxxtd/util/
/D:/BaiduNetdiskDownload/summary/utils/target/classes/application.yml
报NullPointerException,因为class文件同级目录下并无该文件

方式2:通过new File()方法

public static void main(String[] args) throws IOException {
        // 获取当前类所在的工程路径
        String canonicalPath = new File("").getCanonicalPath();
        System.out.println(canonicalPath);
        // 手动拼接resources路径
        String resourcePath = canonicalPath+"\\utils\\src\\main\\resources\\application.yml";
        File file = new File(resourcePath);
        System.out.println(file.isFile());
        System.out.println(file.getAbsolutePath());
    }

代码结果:

D:\BaiduNetdiskDownload\summary
true
D:\BaiduNetdiskDownload\summary\utils\src\main\resources\application.yml

方式3:通过getClassLoader().getResource()方法

public static void main(String[] args) throws IOException {
        // 得到的是当前的classpath路径
        URL url1 = FileOperateUtil.class.getClassLoader().getResource("");
        System.out.println(url1.getPath());
        // 得到的是指定文件的绝对路径
        URL url2 = FileOperateUtil.class.getClassLoader().getResource("application.yml");
        System.out.println(url2.getPath());
    }

代码结果:

/D:/BaiduNetdiskDownload/summary/utils/target/classes/
/D:/BaiduNetdiskDownload/summary/utils/target/classes/application.yml

方式4:通过Thread.currentThread().getContextClassLoader().getResource()方法

public static void main(String[] args) throws IOException {
     // 得到的是当前的classpath路径
        URL url1 = Thread.currentThread().getContextClassLoader().getResource("");
        System.out.println(url1.getPath());
        // 得到的是指定文件的绝对路径
        URL url2 = Thread.currentThread().getContextClassLoader().getResource("application.yml");
        System.out.println(url2.getPath());
    }

代码结果:

/D:/BaiduNetdiskDownload/summary/utils/target/classes/
/D:/BaiduNetdiskDownload/summary/utils/target/classes/application.yml

方式5:web应用下获取web的路径方法(传入参数 HttpServletRequest request)

request.getServletPath();//获取的是contentPath之后的相对路径
        request.getServletContext().getContextPath();//获取的web应用上下文路径
        request.getServletContext().getRealPath(""); //获取的是webapps下面应用的绝对路径

方式6:通过System.getProperty("user.dir") + File.separator + "bin"来获取(不推荐)

public static void main(String[] args) throws IOException {
        String path = System.getProperty("user.dir");
        System.out.println(path);
        String resourcePath = path + File.separator + "utils"
                + File.separator + "src" + File.separator + "main"
                + File.separator + "resources" + File.separator + "application.yml";
        File file = new File(resourcePath);
        System.out.println(file.isFile());
        System.out.println(file.getAbsolutePath());
    }

代码结果:

D:\BaiduNetdiskDownload\summary
true
D:\BaiduNetdiskDownload\summary\utils\src\main\resources\application.yml