关于获取资源文件,Class.getResource和ClassLoa…
2019-02-25 16:10:37来源:博客园 阅读 ()
原文同步发表至个人博客【夜月归途】
原文链接:http://www.guitu18.com/se/java/2019-02-22/29.html
出处:http://www.guitu18.com/
本博客中未标明转载的文章归作者夜月归途和博客园所有。 欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
在Java中经常会需要读取各种各样的配置文件,在获取资源时,一般会用到 Class.getResource()
或 ClassLoader.getResource()
;
那么这两种方式在获取资源文件时有什么相同或者不同的地方呢?
先贴上代码目录结构:
┌─src
│ └─main
│ └─java
│ └─com.guitu18.blog
│ ├─classpath
│ │ └─GetResourceTest.java
│ └─SpringbootApplication.java
└─resource
├─mapper
│ └─BlogDao.xml
└─confog.properties
Class.getResource()
测试代码,先看 this.getClass().getResource()
:
代码的输出结果我直接贴在代码的上一行了,下同。
@Test
public void classGetResource() {
// file:/E:/repo/guitu-blog/target/test-classes/com/guitu18/blog/classpath/
System.out.println(this.getClass().getResource(""));
// file:/E:/repo/guitu-blog/target/test-classes/
System.out.println(this.getClass().getResource("/"));
}
可以看出,getResource("")
获取的是当前类所在包的路径,而 getResource("/")
获取的是 classpath
根路径;
继续测试,我们获取目录下的文件:
@Test
public void classGetProperties() {
// file:/E:/repo/guitu-blog/target/classes/config.properties
System.out.println(this.getClass().getResource("/config.properties"));
// null
System.out.println(this.getClass().getResource("BlogDao.xml"));
// file:/E:/repo/guitu-blog/target/classes/mapper/BlogDao.xml
System.out.println(this.getClass().getResource("/mapper/BlogDao.xml"));
/**
* .java文件在编译后编程.class,所以这里参数传的文件名是.class结尾
*/
// file:/E:/repo/guitu-blog/target/classes/com/guitu18/blog/classpath/GetResourceTest.class
System.out.println(this.getClass().getResource("GetResourceTest.class"));
// file:/E:/repo/guitu-blog/target/classes/com/guitu18/blog/SpringbootApplication.class
System.out.println(this.getClass().getResource("../SpringbootApplication.class"));
// file:/E:/repo/guitu-blog/target/classes/com/guitu18/blog/classpath/GetResourceTest.class
System.out.println(this.getClass().getResource("../classpath/GetResourceTest.class"));
}
输出结果显示:
- 当以
"/"
开头时,是从classpath
路径开始匹配资源; - 当不以
"/"
开头时,是从当前类所在包的路径开始匹配资源; - 两种方式都可以通过
"/"
或"../"
在文件夹上下层路径切换;
另外,在获取文件时,我们还可以通过 getResourceAsStream
直接获取文件输入流,如:
InputStream inputStream = this.getClass().getResourceAsStream("/config.properties");
且 getResourceAsStream()
和 getResource()
在获取文件流和文件路径时,路径选择机制是一样的。
ClassLoader.getResource()
接着看 this.getClass().getClassLoader().getResource
,上代码:
@Test
public void classLoaderGetResource() {
// file:/E:/repo/guitu-blog/target/test-classes/
System.out.println(this.getClass().getClassLoader().getResource(""));
// null
System.out.println(this.getClass().getClassLoader().getResource("/"));
}
在使用 ClassLoader().getResource
获取路径时,不能以 "/"
开头,且路径总是从 classpath
根路径开始;
@Test
public void classLoaderGetProperties() {
/**
* 同样可以通过"/"或"../"在文件夹上下层路径切换
*/
// file:/E:/repo/guitu-blog/target/classes/config.properties
System.out.println(this.getClass().getClassLoader().getResource("config.properties"));
// null
System.out.println(this.getClass().getClassLoader().getResource("BlogDao.xml"));
// file:/E:/repo/guitu-blog/target/classes/mapper/BlogDao.xml
System.out.println(this.getClass().getClassLoader().getResource("mapper/BlogDao.xml"));
/**
* 同Class.getResourceAsStream()一样,我们还可以通过ClassLoader.getResourceAsStream()直接获取文件输入流
* ClassLoader.getResourceAsStream()和ClassLoader.getResource()在获取文件流和文件路径时,路径选择机制也是一样的
*/
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("config.properties");
}
这里跟上面差别不大,所以直接把结果写在代码注释中了, ClassLoader().getResource
只能从 classpath
开始获取资源,同样也能使用getResourceAsStream()
获取文件输入流,且路径机制一样;
总结
Class.getResource()
可以从当前Class
所在包的路径开始匹配获取资源,也可以从classpath
根路径开始匹配获取资源;ClassLoader().getResource()
只能从classpath
根路径开始匹配获取资源;Class.getResource()
从当前包所在路径获取资源时不能以"/"
开头,而从classpath
根路径获取资源时必须以"/"
开头;ClassLoader().getResource()
不能以"/"
开头,且路径总是从classpath
根路径开始;- 它们都能通过
getResourceAsStream()
方法获取对应路径文件的输入流,文件路径匹配机制和其getResource()
方法一样;
原文链接:https://www.cnblogs.com/guitu18/p/10420459.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Java中jar包获取资源文件的方式 2020-06-05
- Java连载120-反射机制获取构造方法和父类、父接口 2020-06-05
- Java获取当前时间到凌晨12点剩余秒数 2020-06-03
- class.getResourceAsStream获取结果为NULL idea配置问题 2020-05-31
- 怎么自学JAVA开发? 2020-05-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash