获取资源文件地址getClassLoader[通俗易懂]

获取资源文件地址getClassLoader[通俗易懂]this.class.getClassLoader().getResourceAsStream与this.class.getResourceAsStream本文转自:http://xixinfei.iteye.com/blog/1256291this.getClass().getClassLoader().getResource("template");   首先,调用对象的getClass()方…

大家好,又见面了,我是你们的朋友全栈君。

this.class.getClassLoader().getResourceAsStream与this.class.getResourceAsStream

本文转自:http://xixinfei.iteye.com/blog/1256291

this.getClass().getClassLoader().getResource(“template”); 
  首先,调用对象的getClass()方法是获得对象当前的类类型,这部分数据存在方法区中,而后在类类型上调用getClassLoader()方法是得到当前类型的类加载器,我们知道在Java中所有的类都是通过加载器加载到虚拟机中的,而且类加载器之间存在父子关系,就是子知道父,父不知道子,这样不同的子加载的类型之间是无法访问的(虽然它们都被放在方法区中),所以在这里通过当前类的加载器来加载资源也就是保证是和类类型同一个加载器加载的。 
最后调用了类加载器的getResourceAsStream()方法来加载资源。

====================================

JAVA运行时,首先会在指定的类路径下(classpath路径下)搜索JAVA编译后的字节码文件(class文件),然后通过类加载器加载到虚拟机中。 DBConn.class.getClassLoader().getResourceAsStream(“database.properties”)
1、DBConn.class得到表示DBConn类的Class对象,请参照JDK中对Class的说明http://wenku.baidu.com/view/1fa5e8ebe009581b6bd9ebe1.html
2、通过Class的getClassLoader方法取得加载DBConn类的类加载器对象ClassLoader。
3、调用ClassLoader的getResourceAsStream方法从类加载路径取得文件的输入流(会通过当前的ClassLoader的findResource方法查找指定文件),请参照:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html#getResourceAsStream%28java.lang.String%29


————————————————————

下面的JdbcUtils.class后面少了个()吗?应该是都可以

   Properties prop = new Properties();
   prop.load(JdbcUtils.class.getClassLoader().getResourceAsStream(“db.properties”));
   String driver = prop.getProperty(“driver”);
   Class.forName(driver);

————————————————————-

1.关于ClassName.class.getClassLoader的几点说明.    
2.经常希望通过ClassName.class.getClassLoader().getResourceAsStream(““)来取得properties文件.通常:ClassName.class.getClassLoader().getResourceAsStream(““)取得的是WEB-INF的下级目录,比如ClassName.class.getClassLoader().getResourceAsStream(“db.properties“).在Tomcat中,可以通过增加”../”来取得上层目录,即WEB-INF目录,这样就可以把properties放在WEB-INF中统一管理。但是WLS不识别”../”。   
3.另外一种土办法,就是不返回classLoader,直接ClassName.class.getResourceAsStream()。然后通过多个”../”(小于6个)来返回相应的上级目录。 

4.当然,如果类扩展了HttpServlet,可以通过getServletContext().getRealPath(“/”)来取得Web部署目录的绝对路径。

———————————————————————      

因此,直接调用 this.getClass().getResourceAsStream(String name);获取流,静态化方法中则使用ClassLoader.getSystemResourceAsStream(String name); 。

———————————————————————

在JDK中,getResourceAsStream是这样定义的:查找具有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。 
因为我是用txt文件当作字典,它存在一个叫dict.aspactword的包下,这样一来,编译后的文件会储存在classPath下,而不是在src下,在动态向字典添加词的时候,classPath下的txt字典没有改变,相对在getResourceAsStream的时候,拿到的自然不是最新的字典,由此感叹,在classPath下如果有不需要改变的文件,在读取时用getResourceAsStream可以保持系统良好的统一性和可移植性,但是在需要改变它们的时候,一定注意修改的路径是classPath下的文件,否则就直接用文件系统的位置来维护你所需要的文件吧

======================================================================================================

常见的有以下两种获取资源文件的方法:

方法一: App.class.getClassLoader().getResourceAsStream(String name)

Returns an input stream for reading the specified resource.

The search order is described in the documentation for getResource(String).

默认从classpath中找文件(文件放在resources目录下),name不能带“/”,否则会抛空指针

方法二: App.class.getResourceAsStream(String name)

查找资源通过给定名称,查询资源的规则与给定的类的class load来实现,这个方法由类的loader来执行,如果这个类由bootstrap加载,那么方法由ClassLoader.getSystemResourceAsStream代理执行。

代理之前,绝对的资源名称通过传入的name参数以下算法进行构造:

如果name以”/”开头,那么绝对路径是/后边跟的名字

如果name不是以”/”开头,那么绝对路径是package名”.”换成“/”以后再加name,例如:com.abc.App就是/com/abc/App/name 或者写作 : ../../name(以class所在路径为基准,文件相对于该类的路径)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136680.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Module build failed (from ./node_modules/eslint-loader/index.js)

    Module build failed (from ./node_modules/eslint-loader/index.js)错误信息:D:\study\vue\vuesaxvuejs-210\vuesaxvuejs-210>npmrunserve>vuesax-vuejs-dashboard-admin-template@2.1.0serveD:\study\vue\vuesaxvuejs-210\vuesaxvuejs-210>vue-cli-serviceserveI…

    2022年6月18日
    33
  • 软件安装 —— 使用官方ODT定制安装Office

    软件安装 —— 使用官方ODT定制安装Office前言正在MacOS11的BigSur如火如荼的宣传着,我这不争气的Windows系统也终于越看越是臃肿,做为生产力工具,第一还是要稳定精简,一气之下,直接换上了Windows特别版本LTSC,据说这个版本特别特别稳定,很长时间才会更新一次,但用过的都说好,想想还是激动的。重装系统是一个重大工程,那做为Windows第二重要的软件Office目前的安装模式要么官方下载安装包要么离线部署,而官方的安装包可谓是一键超级全家桶搬进C盘,有用的没用的全部装一遍,最终还是靠离线部署来安装了,可以定制想要的软件,还

    2025年10月11日
    3
  • JAVA事件适配器的作用

    JAVA事件适配器的作用适配器 其实从接口事件演变尔来的。相当于触发器,说简单点,它就是一些动作。例如说鼠标的按下点击还有键盘等等。适配器就是实现接口事件的类不过,不是真的实现,只是空实现,没有具体的方法体。适配器主要是为了方便程序员操作,避免了代码的重复性。只要一个对象或者属性添加了这个适配器,那么它就会监视这对象或属性。例如说一个按纽。按纽添加一个MouseAdap

    2022年5月4日
    56
  • java集合类框架的基本接口有哪些

    java集合类框架的基本接口有哪些转自:牛客网java集合类框架的基本接口有哪些?答:Collection:代表一组对象,每一个对象都是它的子元素Set:不包括重复元素的CollectionList:有顺序的Collection,并且可以包含重复元素Map:可以把键(key)映射到值(value)的对象,键不能重复下面是详细解释:转自:牛客网(一)总共有两大接口:Collecti

    2022年5月15日
    37
  • Ubuntu base install

    Ubuntu base install

    2021年5月5日
    129
  • VS2010 旗舰版序列号

    VS2010 旗舰版序列号YCFHQ-9DWCY-DKV88-T2TMH-G7BHP转载于:https://www.cnblogs.com/canyuexingchen/p/3229530.html

    2022年7月20日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号