关于获取资源文件,Class.getResource和ClassLoader.getResource的区别
原文同步发表至个人博客【夜月归途】
原文链接:http://www.guitu18.com/post/2019/02/23/28.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()方法一样;
关于获取资源文件,Class.getResource和ClassLoader.getResource的区别的更多相关文章
- Java中获取资源文件的方法总结
这里总结3中方法获取资源文件的 ServletContext Class ClassLoader 文件的位置 1. ServletContext public void doGet(HttpServl ...
- JavaWeb基础: 获取资源文件
Web工程在编译构建完毕以后,需要部署到Tomcat上运行,资源的硬盘路径也会随着改变.要想对资源文件进行读写操作需要获取其硬盘地址,在Web工程中通常通过ServletContext/ClassLo ...
- java基础知识3--如何获取资源文件(Java中获取资源文件的url)
java开发中,常见的resource文件有:.xml,.properties,.txt文件等,后台开发中经常用到读取资源文件,处理业务逻辑,然后返回结果. 获取资源文件的方法说明getResourc ...
- 【Spring】获取资源文件+从File+从InputStream对象获取正文数据
1.获取资源文件或者获取文本文件等,可以通过Spring的Resource的方式获取 2.仅有File对象即可获取正文数据 3.仅有InputStream即可获取正文数据 package com.sx ...
- wpf 前台获取资源文件路径问题
1 <ImageBrush ImageSource="YT.CM.CommonUI;component/Resource/FloadwindowImage/middle.png&quo ...
- 【spring Boot】spring boot获取资源文件的三种方式【两种情况下】
首先声明一点,springboot获取资源文件,需要看是 1>从spring boot默认的application.properties资源文件中获取 2>还是从自定义的资源文件中获取 带 ...
- 关于Class.getResource和ClassLoader.getResource的路径问题
Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. Class.getResource(Stri ...
- 【转】关于Class.getResource和ClassLoader.getResource的路径问题
Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. Class.getResource(Stri ...
- Class.getResource和ClassLoader.getResource的区别分析
原文:http://swiftlet.net/archives/868 在Java中获取资源的时候,经常用到Class.getResource和ClassLoader.getResource,本文给大 ...
随机推荐
- Spark学习之在集群上运行Spark
一.简介 Spark 的一大好处就是可以通过增加机器数量并使用集群模式运行,来扩展程序的计算能力.好在编写用于在集群上并行执行的 Spark 应用所使用的 API 跟本地单机模式下的完全一样.也就是说 ...
- 详解线程池execute和submit用法
在使用线程池时,我们都知道线程池有两种提交任务的方式,那么他们有什么区别呢? 1.execute提交的是Runnable类型的任务,而submit提交的是Callable或者Runnable类型的任务 ...
- 【JVM虚拟机】(7)---深入理解Class中-属性集合
#[JVM虚拟机](7)---深入理解Class中-属性集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机](6)- ...
- TensorFlow从1到2(二)续讲从锅炉工到AI专家
图片样本可视化 原文第四篇中,我们介绍了官方的入门案例MNIST,功能是识别手写的数字0-9.这是一个非常基础的TensorFlow应用,地位相当于通常语言学习的"Hello World!& ...
- 聊一聊C# 8.0中的await foreach
AsyncStreamsInCShaper8.0 很开心今天能与大家一起聊聊C# 8.0中的新特性-Async Streams,一般人通常看到这个词表情是这样. 简单说,其实就是C# 8.0中支持aw ...
- Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库
前言 在 .Net Core 2.2中 Microsoft.AspNetCore.App 默认内置了EntityFramework Core 包,所以在使用过程中,我们无需再从 NuGet 仓 ...
- matplotlib种类
matplotlib模板: 1:线图 plot()单线段图 2:多个线图 subplot()Multiple axes (i.e. subplots) are created with the sub ...
- .netcore2.1在控制器中和类中,获取appsettings中值的方法
一般我们在开发项目中,都会从配置文件中获取数据库连接信息.自定义参数配置信息等. 在.netcore中在控制器和自定义类中,获取配置文件中参数方式如下: appsettings.json { &quo ...
- WebApi 之HelpPage帮助页
1.创建解决方案 2.选择类型-Web API 3.设置项目生成XML路径 同时修改HelpPageConfig,代码调用XML文件位置 3.编写WebApi接口代码 4.启动项目 查看接口 5.测试 ...
- 使用OSG创建一个简单的地形
目录 1.解决方案 1) 使用TIF格式的DEM 2) 描述HeightField 2.存在问题 3.参考文档 1.解决方案 在网上参考了一些资料,使用OSG创建地形最简单的办法就是使用OSG::He ...