原文同步发表至个人博客【夜月归途】

原文链接: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"));
}

输出结果显示:

  1. 当以 "/" 开头时,是从 classpath 路径开始匹配资源;
  2. 当不以 "/" 开头时,是从当前类所在包的路径开始匹配资源;
  3. 两种方式都可以通过 "/""../" 在文件夹上下层路径切换;

另外,在获取文件时,我们还可以通过 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() 获取文件输入流,且路径机制一样;

总结

  1. Class.getResource() 可以从当前 Class 所在包的路径开始匹配获取资源,也可以从 classpath 根路径开始匹配获取资源;
  2. ClassLoader().getResource() 只能从 classpath 根路径开始匹配获取资源;
  3. Class.getResource() 从当前包所在路径获取资源时不能以 "/" 开头,而从 classpath 根路径获取资源时必须以 "/" 开头;
  4. ClassLoader().getResource() 不能以 "/" 开头,且路径总是从 classpath 根路径开始;
  5. 它们都能通过 getResourceAsStream() 方法获取对应路径文件的输入流,文件路径匹配机制和其 getResource() 方法一样;

关于获取资源文件,Class.getResource和ClassLoader.getResource的区别的更多相关文章

  1. Java中获取资源文件的方法总结

    这里总结3中方法获取资源文件的 ServletContext Class ClassLoader 文件的位置 1. ServletContext public void doGet(HttpServl ...

  2. JavaWeb基础: 获取资源文件

    Web工程在编译构建完毕以后,需要部署到Tomcat上运行,资源的硬盘路径也会随着改变.要想对资源文件进行读写操作需要获取其硬盘地址,在Web工程中通常通过ServletContext/ClassLo ...

  3. java基础知识3--如何获取资源文件(Java中获取资源文件的url)

    java开发中,常见的resource文件有:.xml,.properties,.txt文件等,后台开发中经常用到读取资源文件,处理业务逻辑,然后返回结果. 获取资源文件的方法说明getResourc ...

  4. 【Spring】获取资源文件+从File+从InputStream对象获取正文数据

    1.获取资源文件或者获取文本文件等,可以通过Spring的Resource的方式获取 2.仅有File对象即可获取正文数据 3.仅有InputStream即可获取正文数据 package com.sx ...

  5. wpf 前台获取资源文件路径问题

    1 <ImageBrush ImageSource="YT.CM.CommonUI;component/Resource/FloadwindowImage/middle.png&quo ...

  6. 【spring Boot】spring boot获取资源文件的三种方式【两种情况下】

    首先声明一点,springboot获取资源文件,需要看是 1>从spring boot默认的application.properties资源文件中获取 2>还是从自定义的资源文件中获取 带 ...

  7. 关于Class.getResource和ClassLoader.getResource的路径问题

    Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. Class.getResource(Stri ...

  8. 【转】关于Class.getResource和ClassLoader.getResource的路径问题

    Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. Class.getResource(Stri ...

  9. Class.getResource和ClassLoader.getResource的区别分析

    原文:http://swiftlet.net/archives/868 在Java中获取资源的时候,经常用到Class.getResource和ClassLoader.getResource,本文给大 ...

随机推荐

  1. BZOJ_3670_[Noi2014]动物园_KMP

    BZOJ_3670_[Noi2014]动物园_KMP Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的 ...

  2. mysql 使用Navicat Lite如何打开‘查询编辑器’,使用sql语句对表进行操作!

    今天第一次使用mysql,尽然连查询编辑器都找不到,研究了半天,询问了下大牛,才搞出来,准备写下来,后面方面忘记了有查找的地方,哈哈哈~~ 如何打开"查询编辑器",使用sql语句进 ...

  3. mysql服务设置远程连接 解决1251 client does not support ..问题

    在docker里面创建mysql容器后设置的密码在远程主机连接时候出现错误: 一.如果是在docker里面安装的mysql镜像则需要先进入mysql里面:参考上一篇:https://www.cnblo ...

  4. 基于 HTML5 的 WebGL 3D 版俄罗斯方块

    前言 摘要:2D 的俄罗斯方块已经被人玩烂了,突发奇想就做了个 3D 的游戏机,用来玩俄罗斯方块...实现的基本想法是先在 2D 上实现俄罗斯方块小游戏,然后使用 3D 建模功能创建一个 3D 街机模 ...

  5. Tensorflow源码解析1 -- 内核架构和源码结构

    1 主流深度学习框架对比 当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层.比如开发Linux Driver会基于Linux kernel,开发Android app会基于Android ...

  6. Exp6 信息搜集与漏洞扫描 20164312 马孝涛

    1.实践内容 (1)各种搜索技巧的应用  (2)DNS IP注册信息的查询  (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点(以自己主机为目标)  (4)漏洞扫描:会扫, ...

  7. 微软开源自动机器学习工具NNI安装与使用

    微软开源自动机器学习工具 – NNI安装与使用   在机器学习建模时,除了准备数据,最耗时耗力的就是尝试各种超参组合,找到最佳模型的过程了.对于初学者来说,常常是无从下手.即使是对于有经验的算法工程师 ...

  8. 收集整理的一些c++书籍(推荐)

    Accelerated C++中文版 .pdf Beyond the C++ Standard Library(Boost)中文版.pdf Beyond the C++ Standard Librar ...

  9. 【.NET异步编程系列3】取消异步操作

    在.Net和C#中运行异步代码相当简单,因为我们有时候需要取消正在进行的异步操作,通过本文,可以掌握 通过CancellationToken取消任务(包括non-cancellable任务).  早期 ...

  10. android使用.9图作为背景,内容不能居中的问题解决方案

    在xml中使用.9图作为背景,内容不能居中,试了好多方法最后,加一个属性就ok了. android:padding:0dip; 解析:.9图作为背景时,不可拉伸的部分就相当于该空间的padding距离 ...