一:前言

    在自己获取属性时,碰见了XX.class.getResourceAsStream(fileName),自己对这个其实不是很理解,上网查了下资料,又看到了上述的几个,所以就研究了下。

二:内容

  先说说着几个区别吧

  getClassLoader().getResourceAsStream("a.txt"):此方法的路径不管是绝对路径还是想对路径,都是从path下找得,即使"./a.txt"的形式去寻找,在此处我们要注意空指向异常的情况(可以看看这里写的http://cache.baiducontent.com/cm=9d78d513d99c12eb0fb1837e7c4380200e55f0326284915468d5e316ce370d160771e2cb30536713a0b66b6671f30e02b4e47132690c7af1dd8a9f4baea68f7871d57223706bdd124d9b58e5dc46529e778d1bb3f25cf0ba8768d5f18cc4de20089c44040c84f3895803&p=9274c54ad5c246e74bbe9b7c4605bb&newp=867cc54ad5c246bc4bbe9b7c4f0a9f231610db2151d6d11f6cc7&user=baidu&fm=sc&query=maven+getClassLoader%CE%AAnull&qid=bf473e2d0001b6a7&p1=3)。其中写到了Bootstrap ClassLoader (启动类加载器或者叫引导类加载器)加载jdk核心的APIs,这些APIs一般位于jdk_home/lib下;它是一个本地接口,所以不能从java代码中得到它的信息。例如, log(java.lang.String.class.getClassLoader())得到的是null(引用自http://blog.csdn.net/benjieming_wang/article/details/5623492)。classLoader是一种类加载器.

现在我就来附上代码说明吧:

package org.wh.properties;

import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set; public class PropertiesDemo01 {
Properties prop;
public void setProp(Properties prop) {
this.prop = prop;
}
public static void main(String args[]){
loadConfig();
}
public static Properties loadConfig(){
Properties prop = new Properties();
//Class的getResource()方法是从当前.class文件路径查找资源,而ClassLoader则是从jar包中查找
//InputStream input = Properties.class.getResourceAsStream("/jdbcUtils.properties");
InputStream input1 = PropertiesDemo01.class.getClassLoader().getResourceAsStream("jdbcUtils.properties");
System.out.println("jdk的类加载器"+Properties.class.getClassLoader());//结果:jdk的类加载器:null
System.out.println("demo:"+PropertiesDemo01.class.getClassLoader());//结果:demo:sun.misc.Launcher$AppClassLoader@addbf1
try {
prop.load(input1);
@SuppressWarnings("rawtypes")
Set keyValue=prop.keySet();
for(Iterator a=keyValue.iterator();a.hasNext();){
String key=(String) a.next();
String value=prop.getProperty(key);
System.out.println("-key的值--"+key+"value--的值-"+value);
}
} catch (IOException e) {
e.printStackTrace();
}
return prop;
}
}
结论:如果在这里用jdk的内部类就会报空指向异常,我们可以看到Properties.class.getClassLoader()得到的结果是null;

class.getResourceAsStream(fileName):fileName中加了“/”则代表了绝对路径,否则就是相对路径。代码可见上述
再说说Thread.currentThread().getContextClassLoader():这个是当前线程的类加载器,
package org.wh.properties;

public class Test {

    public static void main(String[] args) {

        System.out.println(Thread.currentThread().getContextClassLoader());//当前线程的类加载器
System.out.println(Test.class.getClassLoader());//当前类的类加载器
System.out.println(ClassLoader.getSystemClassLoader());//系统初始的类加载器
} }
参考资料可以看看这里:http://stackoverflow.com/questions/676250/different-ways-of-loading-a-file-as-an-inputstream
  

有关getClassLoader().getResourceAsStream(fileName)、class.getResourceAsStream(fileName)和().getContextClassLoader().getResourceAsStream(fileName)的区别的更多相关文章

  1. Class.forName() 初始化、Thread.currentThread().getContextClassLoader().getResourceAsStream

    Class.forName() 和 ClassLoader.loadClass()的区别? Class.forName() 和 Class.forName().NewInstance()的区别? Cl ...

  2. Thread.currentThread().getContextClassLoader().getResourceAsStream

    Thread.currentThread().getContextClassLoader().getResourceAsStream 2014年04月02日 06:49:47 OkidoGreen 阅 ...

  3. Java中Properties配置文件读取

    以下实践的是Properties配置文件的基本操作方法.像spring使用xml做依赖注入时,这个配置文件起到非常实用的作用. 一.格式规范 参考wiki百科的格式简介:https://zh.wiki ...

  4. mysql数据库连接工具类C3P0

    package com.dl.network_flow.db; import java.sql.Connection; import java.sql.PreparedStatement; impor ...

  5. getResourceAsStream和getResource的用法及Demo实例

    用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大家最经常用的,就是用JAVA的File类,如要取得 D:/test.txt文件,就会这样用File file ...

  6. getResourceAsStream和getResource的用法

    用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大家最经常用的,就是用JAVA的File类,如要取得 D:/test.txt文件,就会这样用File file ...

  7. TestNG 相对路径与绝对路径getResourceAsStream

    以下内容引自: http://blog.csdn.net/zmx729618/article/details/51144588 (注: 此url并非原出处,该文章也是转自他人.但博主未注明出处) Ja ...

  8. 分析Class类和ClassLoader类下的同名方法getResourceAsStream

    在读取本地资源的时候我们经常需要用到输入流,典型的场景就是使用Druid连接池时读取连接池的配置文件.Java为我们提供了读取资源的方法getResourceAsStream(),该方法有三种: Cl ...

  9. getResourceAsStream 地址

    getResourceAsStream ()返回的是inputstream getResource()返回:URL Class.getResource("")    返回的是当前C ...

随机推荐

  1. RedHat7.1 安装Oracle12102

    选型: 32位的内存是个瓶颈,已经是64位的时代了.使用64位的CentOS6 和 64位的Oracle 11g R2 在虚拟机器安装,采用hostonly方式设置网络 注意:能上网的网卡要设置一下I ...

  2. [答网友问]让GridLength支持动画

    原文:[答网友问]让GridLength支持动画 [答网友问]WPF中让GridLength类型支持动画                                                 ...

  3. [Jmeter]jmeter数据库性能测试配置

    学习jmeter过程中,记录一些学习过程中的点点滴滴,用于备忘.本文主要介绍的是如何创建一个简单的测试计划用户测试数据库服务器. 一.添加线程组 二.添加JDBC请求 1.在第一步里面定义并发用户以及 ...

  4. MySQL数据库服务器逐渐变慢分析与解决

    一.检查系统的状态 通过操作系统的一些工具检查系统的状态,比如CPU.内存.交换.磁盘的利用率,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲,这也可能不是一个正常的状态,因为cpu可 ...

  5. 手把手教你写css3通用动画

    之前接了几个微信里的项目,类似电子邀请函,什么分析报告这样的项目, 对css3动画要求十分高,每个页面客户几乎都有天马行空的想法,或者说设计师有这样的想法.众所周知css3里的keyframe写好了就 ...

  6. LaTeX工具——mathpix安利

    官网: https://mathpix.com/ 效果看下图: 图片打不开点这里 识别效果还行,感觉很适合jbc/zcy这种不喜欢打LaTex公式的神仙.

  7. Qt Demo Http 解析网址 Openssl

    今天练习了一下Qt 解析http协议,在Demo中使用到了Openssl 一上午的时间都是编译openssl,不过还是没有成功,很遗憾,这里整理了有关这个Demo的本件 网盘连接:见下方评论吧,长传太 ...

  8. Wannafly挑战赛21:C - 大水题

    链接:Wannafly挑战赛21:C - 大水题 题意: 现在给你N个正整数ai,每个数给出一“好数程度” gi(数值相同但位置不同的数之间可能有不同的好数程度).对于在 i 位置的数,如果有一在j位 ...

  9. linux ----- Vim进入和退出命令

    Vim进入和退出命令     本来不想写任何关于vim的文章的,无奈我今天又忘记怎么退出vim了,常用命令是ESC,然后:wq(保存并退出),:q!(不保存并强制退出),i进入vim模式.另外还有其它 ...

  10. windows基础知识(win7)

    右击 显示: 对设备进行管理: 在计算机属性中,开远程连接 控制面板: 控制面板下的操作中心: 控制面板下的管理工具: 控制面板下的默认程序: 控制面板下的日期时间: 控制面板下的鼠标: 控制面板下的 ...