转载自: https://www.cnblogs.com/bhlsheji/p/4095699.html

◆普通情况下,我们都使用相对路径来获取资源,这种灵活性比較大.

比方当前类为com/bbebfe/Test.class

而图像资源比方sample.gif应该放置在com/bbebfe/sample.gif

而假设这些图像资源放置在icons文件夹下,则应该是com/bbebfe/icons/sample.gif

通过当前类文件的路径获取资源主要有例如以下几种方式:

· 如果当前类为com.bbebfe.Test

· 包所在的目录为bin

String imageName = "icons/sample.gif"

1, 通过Class.getResource()定位类路径下的资源(bin/com/bbebfe/icons/sample.gif)

Class clazz = this.getClass();

URL url = clazz.getResource(imageName);

2,通过ClassLoader.getResource()定位包的根文件夹下的资源(bin/icons/sample.gif)

Class clazz = this.getClass();

URLClassLoader loader = (URLClassLoader)clazz.getClassLoader();

URL url = loader.getResource(imageName);

3, 通过ClassLoader.findResource()提供自己定制的方式定位资源

URL url = loader.findResource(imageName);

◆那么这三种方法有那些差别, 我们应该在何时使用哪种方法呢?

· Class.getResource() 方法

该方法实际通过该Class的Class Loader的getResource()方法来获得资源, 在调用ClassLoader的getResource()方法之前, Class.getResource()方法会对资源名称做一定的处理,构建一个该资源的绝对名称(absolute name, 大意是:

+假设资源名称以'/'('"u002f') 開始, 则资源的绝对名称是'/'以后的部分.

假设imageName是"/icons/sample.gif", 则在这里会变成"icons/sample.gif"

+否则对于其它情况, 绝对名称将是例如以下形式(给资源名称的前面加上modified_package_name/):
              modified_package_name/resource_name (修正的包名称/资源名称)

当中修正的包名称含义是将当前对象所在的包名称中的'.'('"u002e')替换为'/'

假设ClassLoader.getResource()方法返回一个值为null的URL, 则Class.getResource()方法终于会将资源请求交给ClassLoader.getSystemResource(java.lang.String).

· ClassLoader.getResource() 方法

该对资源进行查找, 资源的名称是以'/'分隔的路径, 这种方法首先查找自己的父亲ClassLoader,由自己的父ClassLoader来查找资源(实际上, 假设父亲的父亲不是空, 则父亲仍会向上提交查找请求). 假设自己的父ClassLoader是null, 则查找Java虚拟机中内建的class loader, 并将资源请求提交给它们, 假设这些操作都失败了, 则ClassLoader会调用自己的findResource()方法来查找资源.

· ClassLoader.findResource() 方法

该方法在内部查找指定的资源, 假设你实现了自己的Class Loader,则应该重载这种方法以自己特定的方式来查找类文件和资源.

◆通过以上的总结, 我们能够看到三点.

1, 不管是getResource(), 还是findResource(), 这些方法都仅仅是资源的定位方法, 终于都仅仅是返回一个URL, 仅仅是对资源的定位而已, 我们随后应通过自己的方法来读取这些资源. 而在Class和ClassLoader中还定义的有getResourceAsStream方法, 该方法是getResource的增强版, 这里就不介绍了.

2,假设须要以类为相对路径查找资源, 则应该调用Class.getResource()方法, 不要直接调用ClassLoader.getResource()方法. 另外, 除非是你自定义了ClassLoader并重载了findResource方法,否则也不要直接调用ClassLoader.findResource方法, 由于在Class.getResource()方法中会对资源名称作一定的处理, 这在上面介绍了, 以下举个实例:

如果我的当前类在EclipseprojectDatabase下, 类所在的包是com.bbebfe.test, 而icons文件夹放在bin/com/bbebfe/test/文件夹下, 我须要得到icons/sample.gif文件的URL, 则调用this.getClass().getResource()得到的URL是:

file:/E:/MyLife/MyProjects/Eclipse3.2/Database/bin/com/bbebfe/test/icons/disremove.gif

 

3, 有时候我们希望某个jar库的图像资源在同一个icons下统一管理, 而不是为每一个包以下的Class建一个icons, 也就是说须要以库为相对路径来查找资源, 此时则应该调用ClassLoader.getResource()方法, 举个样例:

·某个project有例如以下的包结构:

com.bbebfe.ui

com.bbebfe.test

com.bbebfe.database

·假设以类为相对路径, 则在每一个包下都必须建立一个icons文件夹, 并放置对应的资源文件. 例如以下:

com.bbebfe.ui/icons/...

com.bbebfe.test/icons/...

com.bbebfe.database/icons/...

·而我们可能希望在根文件夹下放置一个icons文件夹, 把全部资源放置在这里管理, 这样还能够防止资源的反复. 就是例如以下形式

com.bbebfe.ui

com.bbebfe.test

com.bbebfe.database

icons/sample.gif ...

则此时我们应该调用ClassLoader.getResource方法, 因为它没有对资源名称作处理, 也就是说没有将修正的包名加入到资源名称前, 所以它会在类所在的包的根下去查找资源.(执行java程序的语法是java com.bbebfe.ui.Test, 所以根文件夹是com文件夹的上级文件夹).

◆最后, 在Java中对资源进行定位的方法有非常多种, 在Eclipse源码中还有例如以下一段定位文件资源的代码, 还没有时间研究, 以后再谈:

ProtectionDomain domain = Main.class.getProtectionDomain();

CodeSource source = null;

URL result = null;

if (domain != null)

source = domain.getCodeSource();//获得code source

if (source != null)

result = source.getLocation();//获得URL

String path = decode(result.getFile());//

// normalize to not have leading / so we can check the form

File file = new File(path);

path = file.toString().replace('""', '/');

// create a file URL (via File) to normalize the form (e.g., put

// the leading / on if necessary)

path = new File(path).toURL().getFile();

刚才试了一下,发现假设类路径上有反复的资源,getResource()方法会返回类路径上碰到的第一个资源。

而getResources()则会返回当前类载入器路径上的全部反复资源以及父类载入器上的全部反复资源。

比方,在tomcat/lib文件夹下放置一个zip文件,包括config/aaa.txt文件, 
在WEB-INF/lib文件夹下复制一份这个zip文件, 
再在src文件夹下放上config/aaa.txt文件,

getResource("config/aaa.txt")返回结果是: 
file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/classes/config/aaa.txt

getResources("config/aaa.txt")返回结果是: 
file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/classes/config/aaa.txt 
jar:file:/D:/apache-tomcat-6.0.16/lib/aaaaa.jar!/config/aaa.txt 
jar:file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/lib/bbbbb.jar!/config/aaa.txt

转载于:https://www.cnblogs.com/FengZeng666/p/10850179.html

classloader.getresources() 介绍相关推荐

  1. 深入类加载器-类加载器作用,类缓存、类加载器的层次结构、ClassLoader类介绍、代理模式之双亲委派机制

    1.类加载器的作用 类加载器的作用是将class字节码文件加载到内存中,并将这些静态数据转化为方法区中的运行时数据结构,同时在堆中生成代表这个类的java.lang.Class对象,作为访问方法区中数 ...

  2. class.getResources与ClassLoader.getResources的区别

    class.getResources与ClassLoader.getResources有不同的访问途径,如果访问方式不对,只会得到null值. Maven工程目录如下 如上图,编译后,maven会将s ...

  3. 【java】ClassLoader.getResources加载资源的顺序

    目录 前言 代码说明 目录结构 FromMultiJar/pom.xml 代码 编译后目录结构 启动命令 ClassLoader.getResources加载资源的顺序 先在本应用(FromMulti ...

  4. 【java】ClassLoader.getResources加载资源

    目录 前言 代码说明 目录结构 FromMultiJar/pom.xml 代码 编译后目录结构 启动命令 执行结果 前言 maven多模块项目 代码说明 目录结构 LoadResources ├─Fr ...

  5. ClassLoader.getResources 能搜索到的资源路径

    代码如下 public static void main(String[] args)throws Exception {ClassLoader cl = xxxx.class.getClassLoa ...

  6. Java ClassLoader getResources()方法与示例

    ClassLoader类的getResources()方法 (ClassLoader Class getResources() method) getResources() method is ava ...

  7. java getresources方法_Java ClassLoader getResources()方法与示例

    ClassLoader类getResources()方法getResources()方法在java.lang包中可用. getResources()方法用于标识具有给定资源名称的所有资源. getRe ...

  8. java getresources方法_java-如何正确使用ClassLoader.getResources()?

    这是获取某个URL对象指向的File对象的最简单方法: File file=new File(url.toURI()); 现在,对于您的具体问题: 在META-INF"目录"中查找 ...

  9. Class.getResources()和classLoader.getResources()区别

    Class.getResource(String path) path不以'/'开头时,默认是从此类所在的包下取资源: path 以'/'开头时,则是从ClassPath根下获取: package t ...

最新文章

  1. va_list和va_start和((A*)0)-a
  2. 火车票上的星号暗藏玄机?!
  3. CMake命令之function
  4. 浅谈跨平台框架 Flutter 的优势与结构
  5. linux排序语言,Linux sort 排序命令uniq去重复行
  6. python基本用法_python基本用法
  7. lvs-nat负载均衡模式
  8. 单片机模块学习之数码管
  9. mysql一些写常用命令
  10. Ubuntu连接SSHHow to: Connect SSH, SFTP and FTP Servers using Nautilus ubuntu 13.04
  11. 关于忘记MySQL的root用户密码的问题
  12. anaconda老版本下载的方法
  13. 燕十八MySQL优化学习笔记
  14. XP下如何引导Vista
  15. PE接受失败:一场被迫发生的行业革命
  16. html 倒计时弹出框,alert警告框倒计时
  17. 用过滤器来解决JSP中文乱码问题
  18. springBoot2学习
  19. 大数据-玩转数据-IDEA创建Maven工程
  20. h5调用指纹识别_基于HTML Canvas实现“指纹识别”技术,canvas指纹

热门文章

  1. Python operator.le()函数与示例
  2. dbms和sql_DBMS | 并发控制和各种并发控制方法
  3. c+ +三角函数_C ++中的三角函数
  4. 【桶】220.存在重复元素 III 【LeetCode】
  5. 怎么暂时关闭网站php,WordPress怎么临时关闭网站进行维护
  6. 阶乘因式分解(一) -- ACM解决方案
  7. 744. 寻找比目标字母大的最小字母 golang
  8. 浅谈shell中的clear命令实现
  9. C语言随机数生成超详解
  10. C++ 普通函数与函数模板 区别以及调用规则01