关于Resource loader、ClassLoader及文件加载相关问题咨询
Java资源加载相关问题解答
1. 什么是Resource Loader?
Resource Loader(资源加载器)就是Java中专门用来定位、读取类路径下资源文件的机制,不管是配置文件、静态资源还是打包在jar/classes目录里的文件,都能通过这套机制找到并加载。核心作用就是帮你摆脱本地文件系统路径的限制,不用硬写死本地绝对路径。
2. ClassLoader.getResources() 和 this.getClass().getResource() 的原理与区别
核心原理
这两个方法都是基于**类加载器的类路径(classpath)**扫描资源:Java类加载器会从它负责的加载路径(比如项目的src/main/resources、依赖jar包的根目录等)里查找匹配路径的资源,找到后返回对应的资源标识。
具体区别
路径规则与类加载器来源
this.getClass().getResource(String path):使用加载当前类的类加载器,路径有两种规则:- 路径以
/开头:从类路径根目录开始查找,比如/config.properties就是找classpath根下的该文件 - 路径不以
/开头:默认从当前类所在的包目录开始查找,比如你的类在com.example包下,写test.txt会找com/example/test.txt
- 路径以
ClassLoader.getResources(String path):使用调用该方法的类加载器实例(通常是系统类加载器),路径不能以/开头,默认从类路径根目录查找,比如config.properties对应classpath根下的文件,com/example/test.txt对应包下的文件
返回值差异
getClass().getResource():返回单个URL对象,只返回找到的第一个匹配资源ClassLoader.getResources():返回Enumeration<URL>,会返回所有类路径下匹配该路径的资源(比如多个jar包都有同名配置文件时,能一次性获取所有)
3. 能否直接通过绝对路径创建InputStream定位包内文件?
不建议这么做,多数情况下根本行不通:
- 项目打包成jar/war后,包内文件是压缩在归档文件里的,不存在真实的本地文件系统绝对路径,硬写的本地绝对路径只会指向本地磁盘,找不到jar里的资源
- 就算是开发阶段,本地绝对路径和部署后的路径大概率不一致,硬写路径会导致代码无法跨环境运行
如果要读取资源,推荐用类路径相对路径配合类加载器获取InputStream,示例代码:
// 从类路径根目录读取资源 InputStream is = this.getClass().getResourceAsStream("/config.properties"); // 或者通过系统类加载器读取 InputStream is = ClassLoader.getSystemResourceAsStream("config.properties");
内容的提问来源于stack exchange,提问作者Edoardo S
相关产品推荐
相关产品推荐

