前言
- 在Java中获取资源的时候,经常用到getResource和getResourceAsStream,本文总结一下这两种获取资源文件的路径差异。
getResource()
1. Class类 获取:
传统方式 :new File
File file = new File(“src\set1\hello.txt”);
getResource()
获取hello.txt
第一种:
File file = new File(test01.class.getResource(“hello.txt”).getFile());
方法二:
File file = new File(test01.class.getResource("/set1/hello.txt").getFile());
获取hello02.txt
File file = new File(test01.class.getResource("/resource/hello02.txt").getFile());
特别注意;
- 第一;这是在java工程下
- 第二:注意Project Structure的加载
Files–>Project Structure–>modules–>source 找到resources文件夹,右键选择resourses,右边会出现resource folders
没有加载的情况 报错
设置Project Structure resourses
2.ClassLoade 类获取;
Object.class.getClassLoader().getResource();
Class.getResource()源码
Class.getResource()实际也是先获得类加载器ClassLoader然后再去获取资源
Class.getClassLoader.getResourceAsStream(String path)
:默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
总结:getResource()
- path不以’/'开头时,默认是从此类所在的包下取资源;
- path以’/'开头时,则是从项目的ClassPath根下获取资源。在这里’/'表示ClassPath的根目录。
- 实际内在是Class.getClassLoader.getResourceAsStream(String path)
- 由Class.getClassLoader.getResourceAsStream(String path)获取资源默认则是从ClassPath根下获取,path不能以’/'开头。
getResourceAsStream()
Class.getResourceAsStream(String path) 总结 :
- path不以’/'开头时,默认是从此类所在的包下取资源;
- path以’/'开头时,则是从项目的ClassPath根下获取资源。在这里’/'表示ClassPath的根目录。
- 实际内在Class.getClassLoader.getResourceAsStream(String path)
获取hello.txt
InputStream in = test01.class.getResourceAsStream(“hello.txt”);
InputStream in = test01.class.getResourceAsStream("/set1/hello.txt");
获取hello02.txt
InputStream in = test01.class.getResourceAsStream("/resource/hello02.txt");
同样可以通过Class.getClassLoader.getResourceAsStream(String path) :
Class.getClassLoader.getResourceAsStream(String path)
:默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
另外的方式:
获取 ClassLoader 的途径
- 获取当前 ClassLoader:clazz.getClassLoader()
- 获取当前线程上下文的 ClassLoader:Thread.currentThread().getContextClassLoader()
- 获取系统的 ClassLoader:ClassLoader.getSystemClassLoader()
- 获取调用者的 ClassLoader:DriverManager.getCallerClassLoader()
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(“hello.txt”);
SpringBoot工程下获取资源
注意:springboot 默认资源放在src/main/resource下
案例:
InputStream in = test02.class.getClassLoader().getResourceAsStream(“hello.txt”);
获取hello.txt
- 默认是从此类所在的包下取资源;
获取hello02.txt
Class.getClassLoader.getResourceAsStream(String path) 记得path不能以’/'开头
另外的方式:
获取 ClassLoader 的途径
- 获取当前 ClassLoader:clazz.getClassLoader()
- 获取当前线程上下文的 ClassLoader:Thread.currentThread().getContextClassLoader()
- 获取系统的 ClassLoader:ClassLoader.getSystemClassLoader()
- 获取调用者的 ClassLoader:DriverManager.getCallerClassLoader()
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(“hello.txt”);