class.getResource与classloader.getResource

前言

之前偶然看到一篇别人写的文章 https://www.cnblogs.com/drwong/p/5389631.html .对于怎么找到classpath下的资源,比如图片呀,视频呀什么的..勾起了我的一点好奇心.

现在大家项目一般都是springboot的.那加载资源还是比较简单的..比如ClassPathResource呀..PathMatchingResourcePatternResolver呀(没有仔细确认,但是我印象中mybatis整合spring-boot的时候是用这个类去加载xml配置的)等等.

但是原生的java方法.或者比如以前大学时代做gui的时候.没有spring.加载个图片可能用的最多的就是class.getResource或者classloader.getResource了.那么到底该用哪个方法? 资源开头是不是要加斜杠 / 呢? 这里我记录一下我的想法.

class.getResource

基本操作大概就是下面这样

 1 package test;
 2
 3 public class ClassLoaderTest2 {
 4
 5     public static void main(String[] args) throws ClassNotFoundException {
 6         ClassLoaderTest2.class.getResource("/"); // name = "" subString(1)
 7         ClassLoaderTest2.class.getResource(""); // name = "test/"  .会被替换成/
 8         // name = resolveName(name); ClassLoader.getResource
 9     }
10 }

class.getResource最终是会掉classLoader.getResource方法的.但是会对你传入的字符串进行一些处理

在resolveName这一步中.

如果你是传入的是/开头的字符串.那返回的name就是去掉/的内容.在我的例子里返回就是"",即空字符串.

如果你传入的不是/开头的字符串.那他会把你的className中的.全部替换成/  比如我的class是test.ClassLoaderTest2 那就会变成 test/  所以我传入的""就变成了 "test/"

可以参考我代码中的注释.

classloader.getResource

因为class.getResource最后也是调用了classloader.getResurce.所以最终怎么找资源还是得看你的classloader是怎么写的.是哪个classloader.

所以就想那篇文章中写的.在main运行程序与在tomcat里运行程序会有不同的现象.

因为在tomcat中运行的时候classloader是webappClassLoader.

他会对你传入的name做处理.不管你是/开头还是不是/开头.都会去掉这个/然后拼接上/WEB-INF/classes/

所以在tomcat下你写/开头还是不写/开头都是一样的.都是相对/WEB-INF/classes下的路径.

但是如果不是tomcat的classloader,比如在main里运行.那classloader是AppClassLoader.里面最终会调用sun.misc.URLClassPath.findResource 没有源码..追不下去了.

测试结果是写相对路径(没有/)的时候是相对于你的classes的例如/D:/work/idea/ws/test/target/classes/

如果写绝对路径/开头.会直接找不到资源.

小结

小结一下.如果你是main里运行的程序.

如果是class.getResource.那就写/开头然后跟上你的classes下的相对路径地址

如果你是classloader.getResource.那就不要写/开头.然后跟上你的classes下的相对路径地址

原文地址:https://www.cnblogs.com/abcwt112/p/12242577.html

时间: 2024-08-11 18:14:26

class.getResource与classloader.getResource的相关文章

myBatis中的注解@Param、返回值为Map、JAVA读取Excel并解析文本、Class.getResource()和ClassLoader.getResource()

myBatis中的注解@Param:http://blog.csdn.net/gao36951/article/details/44258217:  http://www.cnblogs.com/thomas12112406/p/6217211.html. myBatis返回值为Map:http://blog.csdn.net/werewr342352321df/article/details/11892755. ====================== JAVA读取Excel并解析文本:h

[Java开发之路](18)关于Class.getResource和ClassLoader.getResource的路径问题

Java中取资源时,经常用到Class.getResource和ClassLoader.getResource.昨天老师讲解题目时候,问我们为什么你们都是在文件前家上"/": String path = Resources.class.getResource("/a.txt").getPath(); 注:在Resources文件下创建了a.txt文件 我想我反正是试出来的,不使用"/"不行.为了正式解答心中的疑惑,我们正式来看看Resources

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

Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. 转自:http://www.cnblogs.com/yejg1212/p/3270152.html Class.getResource(String path) path不以’/'开头时,默认是从此类所在的包下取资源: path 以’/'开头时,则是从ClassPath根下获取: 什么意思呢?看下面这段代码的输出结果就明白了: package

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

Class.getResource(String path)path不以'/'开头时,默认是从此类所在的包下取资源:path以'/'开头时,则是从项目的ClassPath根下获取资源.在这里'/'表示ClassPathJDK设置这样的规则,是很好理解的,path不以'/'开头时,我们就能获取与当前类所在的路径相同的资源文件,而以'/'开头时可以获取ClassPath根下任意路径的资源.如下所示的例子: 1 2 3 4 5 6 7 8 public class Test { public stat

Class.getResource和ClassLoader.getResource的路径写法

Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. Class.getResource(String path) path 不以’/'开头时,默认是从此类所在的包下取资源:以’/'开头时,则是从ClassPath根下获取: 同样用法的还有Class.getResource和Class.getResourceAsStream. Class.getClassLoader().getResource

Java Class.getResource和ClassLoader.getResource的使用

Java中获取资源文件的时候,经常会用到Class.getResource和ClassLoader.getResource,本文给大家说一下这两者方法在获取资源文件时的路径差异. Class.getResource(String path) path不以'/'开头时,默认是从此类所在的包下取资源: path以'/'开头时,则是从项目的ClassPath根下获取资源.在这里'/'表示ClassPath JDK设置这样的规则,是很好理解的,path不以'/'开头时,我们就能获取与当前类所在的路径相同

Class.getResource和ClassLoader.getResource区别与分析

零. 前言 在一个获取文件路径的代码内容上发现单元测试出现NullPointer, 但是这段代码却在服务器正常运行了两年多, 借此机会想认真探索下这两个方法的区别. 一. 区别 区别从代码输出结果来看比较清晰, 文件结构图: 以下为在多个场景下使用方式的代码: package com.wenniuwuren.test; /** * 获取文件路径 * Created by wenniuwuren on 15/8/14. */ public class GetResourceTest { publi

关于Class.getResource和ClassLoader.getResource的路径问题(转)

参考博客:http://www.cnblogs.com/yejg1212/p/3270152.html Class.getResource(String path) 当path以/开头,如/a/b/c.properties时,查找的路径为: classpath路径:path. 当path不以/开头时,如c.properties,查找的路径为:当前调用类的路径:path. 什么意思呢?看下面这段代码的输出结果就明白了: package testpackage; public class TestM

Class和ClassLoader.getResource获取资源

资源就是系统内.项目内的各种文件.在Java中获取可以用File类和Class.getResource获取资源,直观的说,File是依赖于文件系统和操作系统的,通过相对和绝对路径定位,使用File接口可以用于获取系统内任何路径下的普通文件.Class和ClassLoader可以用于获取项目环境中的资源,'环境中'的具体定义就是classpath.classpath相当于getResource参数的跟目录,ClassLoader.getResource是只能从这个根目录开始定位资源,Class.g