获取资源文件地址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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • dropdownlist控件的使用方法_redis通知机制

    dropdownlist控件的使用方法_redis通知机制假设:数据源控件GrdiView,无刷新UpdatePannel,友情提示UpdateProgress,分页下拉框DropDownList一般情况下:Gridview的分页有linkbutton或者button,这样要是想让UpdateProgress提示,很简单,先让GridView隐藏,然后给它加个OnClientClick就搞定!在DropDownList的oncha

    2022年9月11日
    0
  • C#下使用XmlDocument详解

    C#下使用XmlDocument详解XML在开发中作为文件存储格式、数据交换的协议用的非常普遍,各个编程语言有都支持。W3C也制定了XMLDOM的标准。在这里主要介绍下.Net中的XmlDocument,包括xml读取和写入等功能。一、Xml的加载读取1、数据等准备Xml测试数据:-读取的数据,我们定义了一个实体类LocationCamera,用来保存Xml解析后的数据:public

    2022年6月22日
    162
  • django2.0_django前端模板

    django2.0_django前端模板通过大量图片示例,手把手的带你创建一个要素齐全的django项目。

    2022年8月6日
    1
  • smartctl命令详解_fuser命令

    smartctl命令详解_fuser命令smart用法1.smartctl-son/dev/sda”开启磁盘的smart功能2.smartctl-a/dev/sda”显示磁盘的详细smart信息3.smartctl–test=short/dev/sda4.smartctl–test=short/dev/sdb检查磁盘坏道…

    2022年10月8日
    0
  • Spatial Dropout

    Spatial DropoutSpatialDropout是Tompson等人在图像领域提出的一种dropout方法。普通的dropout会随机地将部分元素置零,而SpatialDropout会随机地将部分区域置零,该dropout方法在图像识别领域实践证明是有效的。dropoutdropout是怎么操作的?一般来说,对于输入的张量x,dropout就是随机地将部分元素置零,然后对结果做一个尺度变换。比如,我们随机初始化一…

    2022年4月30日
    51
  • linux 驱动移植_免驱动led灯好吗

    linux 驱动移植_免驱动led灯好吗通过前两篇文章的介绍,我们已经把linux内核移植到了tiny210上,但是看到的现象都是通过超级终端来观察的,下面了,我们介绍一下led灯的移植,给大家一个更直观的感受。这篇文章主要的内容如下:1.对平台总线的简介;2.led驱动的移植。一.平台总线   首先介绍一下,我们为什么要简单介绍一下平台总线呢?因为我们是做led驱动的移植,而不是自己编写led的驱动代码。我们要移植

    2022年9月25日
    0

发表回复

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

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