获取资源文件地址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所在路径为基准,文件相对于该类的路径)

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Zotero教程_zotero更改默认浏览器

    Zotero教程_zotero更改默认浏览器论文管理工具Zotero使用教程。

    2022年10月10日
  • vim中保存退出_文档没保存就关了怎么恢复

    vim中保存退出_文档没保存就关了怎么恢复保存命令按ESC键跳到命令模式,然后::w保存文件但不退出vi:wfile将修改另外保存到file中,不退出vi:w!强制保存,不推出vi:wq保存文件并退出vi:wq!强制保存文件,并退出viq:不保存文件,退出vi:q!不保存文件,强制退出vi:e!放弃所有修改,从上次保存文件开始再编辑

  • 流利说文本level6_流利说level4原文

    流利说文本level6_流利说level4原文Level6Unit11/4ListeningLesson1Harry’sInjury1-2DialogueLesson3Lovers’QuarrelReadingLesson4TheBoyWhoCriedWolfLesson5SurvivalintheOutback2/4ListeningLesson1T…

  • snmp trap 接收_amtrak

    snmp trap 接收_amtrak在进行winsnmp及其它api进行snmp开发时,基本上都会有一个接收trap的功能

  • pycharm加注释的快捷方式_pycharm缩进设置

    pycharm加注释的快捷方式_pycharm缩进设置pycharm快捷键缩进选中+tab反缩进选中+shift+tab多行注释选中+ctrl+/重复这一过程取消注释

  • 2022保密教育线上培训考试题答案_吉林继续教育培训考试平台

    2022保密教育线上培训考试题答案_吉林继续教育培训考试平台卷7单选题1.关于涉外活动保密管理要求,下列说法错误的是()。正确答案:D.在紧急情况下,利用国(境)外通信设施进行涉密通信联络2.参加涉外活动一般不得携带涉密载体,确需携带机密级、秘密级涉密载体的,要经()批准。正确答案:C.机关、单位主管领导3.涉密人员离开原涉密单位,调入其他国家机关和涉密单位的,脱密期管理由()负责。正确答案:D.调入机关、单位4.国家秘密确定的基本程序为:在国家秘密产生的同时,由()对照保密事项范围提出定密的具体意见,再由定密责任人审核批准。正确答案:

发表回复

您的电子邮箱地址不会被公开。

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