项目中,有时候要读取当前classpath下的一些配置文件,下面介绍下Class.getResourceAsStream和ClassLoader.getResourceAsStream两种方法以及两者的区别。

1. Class.getResourceAsStream

首先, 我们必须先了解根路径“/”是如何定义的,这对我们使用getResourceAsStream准确加载文件是很重要的。

首先,我们要明白这个根路径是对应类所处类路径上的根目录!什么意思呢?假如一个项目经过编译之后生成了如下class文件和目录结构:

com
|-github
|-test
| |-Test1.class
| |-testdata1.txt
|-Test2.class
|-testdata2.tx2
在这样的编译输出目录下,文件"testdata1.txt"的绝对路径名为:"/com/github/test/testdata1.txt" 文件"testdata2.txt"的绝对路径名为:"/com/github/testdata2.txt"
如同getResourceAsStream方法文档上的解释:以/开头时是绝对路径,与类路径不同的是路径上的"."换成了"/"。

如果使用eclipse,则如图:

则classes这个目录下面为根目录。

相对路径:相对”路径总是指相对于当前class的路径。

例如:

InputStream is= Test1.class.getResourceAsStream("testdata1.txt");  

路径不是以/开头,说明这是一个相对路径,相对的是Test1.class这个文件,所以,这里的“testdata1.txt”所指的正确位置是与Test1.class处于同一目录下的testdata1.txt文件,这一文件是存在的,所引不会报错。

如果我们按相对路径的方式通过Test1去加载testdata2.txt,则路径应该这样描述:

InputStream is= Test1.class.getResourceAsStream("../testdata2.txt");

用“.."表示上一级目录。

如果我们按相对路径的方式通过Test2去加载testdata1.txt,则路径应该这样描述:

InputStream is= Test2.class.getResourceAsStream("test/testdata1.txt");

注意:test前是没有"/"的,这是一个相对路径,是相对于Test2所在包下的test子包里的testdata1.txt文件,所以这个路径也是正确无误的。

不以"/"开头时默认是从此类所在的包下取资源,以"/"开头则是从ClassPath(Src根目录)根下获取。  

2. ClassLoader.getResourceAsStream

Class.getResourceAsStream最终调用是ClassLoader.getResourceAsStream

在使用ClassLoader.getResourceAsStream时,路径直接使用相对于classpath的绝对路径,默认是从ClassPath根下获取,并且不能以"/"开头。

有以下规则:
1. 如果参数以"/"开头,则去除"/"。

2. 否则把当前类的包名加在参数的前面。

InputStream resourceAsStream = ClassLoader.getSystemResourceAsStream("com/github/demo/1.txt");

 

Class.getResourceAsStream和ClassLoader.getResourceAsStream方法的更多相关文章

  1. 对Class.getResourceAsStream和ClassLoader.getResourceAsStream方法所使用的资源路径的解释

    这是个非常基础的问题了,这里提供一些演示样例,帮助高速理解和记忆这个问题. 在该方法的文档:http://docs.oracle.com/javase/7/docs/api/java/lang/Cla ...

  2. Class.getResourceAsStream() VS. ClassLoader.getResourceAsStream()

    For Class.getResourceAsStream(String name), if the name parameter doesn't start with a "/" ...

  3. Class.getResourceAsStream()与ClassLoader.getResourceAsStream()的区别

    Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致. 例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest.clas ...

  4. Class.getResourceAsStream()与ClassLoader.getResourceAsStream()获取资源时的路径说明

    Class.getResourceAsStream(): com.xusweeter.iot.ws.vodafone.config.VodafoneServiceConfig.class.getRes ...

  5. class getResourceAsStream 和 classloader getResourceAsStream获取资源的不同

    工程目录结构: prj(工程根目录) cn json classloader GetResourceByClassAndClassLoader.Java beans.xml /** * */ pack ...

  6. ClassLoader.getResourceAsStream(name);获取配置文件的方法

    ClassLoader.getResourceAsStream(name);路径问题 InputStream in = getClass().getResourceAsStream('/'+" ...

  7. classLoader.getResourceAsStream中文乱码

    一直用一个方法安然无恙,今天在新项目中突然乱码了,原代码: ClassLoader classLoader = Thread.currentThread().getContextClassLoader ...

  8. 1、ClassLoader.getResourceAsStream() 与Class.getResourceAsStream()的区别

    1.ClassLoader.getResourceAsStream() 与Class.getResourceAsStream()的区别 例如你写了一个MyTest类在包com.test.mycode ...

  9. JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别

       Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致. 例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest.c ...

随机推荐

  1. 3DMax脚本插件--改动材质&贴图名称

    从网上淘到了一套人物的模型,当时的心情是激动无比,掏出用的不熟练的3DMax折腾了半天.突然发现了一个蛋疼的事儿,所有的模型文件,材质名称,子材质,以及贴图所实用的是中文命名!! ! 尽管说是能跑,只 ...

  2. cocos2d 重写顶点着色语言

    bool CCShaderSprite::initWithFile( const char *pszFilename ) {  bool ret=false;  do  {    ret=CCSpri ...

  3. 翻转子串(string+KMP+程序猿面试金典)

    翻转子串 參与人数:1197时间限制:3秒空间限制:32768K 通过比例:35.03% 最佳记录:0 ms|8552K(来自 ) 题目描写叙述 假定我们都知道很高效的算法来检查一个单词是否为其它字符 ...

  4. VB 中定义FileSystemObject对象,要先添加对象

     存取文件的方法有很多种,可以使用上述VB提供的函数,使用Windows API函数等等,但是最简单的方法是使用FileSystemObject对象. 1.使用FileSystemObject对象 F ...

  5. 解决java.lang.OutOfMemoryError: unable to create new native thread问题

    解决:1.升级JVM到最新的版本 最新版本的JVM一般在内存优化方面做的更好,升级JVM到最新的版本可能会缓解测问题2.从操作系统层面去解决 使用64位操作系统 如果使用32位操作系统遇到unable ...

  6. “error: command 'x86_64-linux-gnu-gcc' failed with exit status 1” in virtualenv

      Most of the time these are dependency-issues. Following the stack-trace of the gcc compiler one ca ...

  7. idea 修改编辑区字体样式、大小

      idea 修改编辑区字体样式.大小 CreateTime--2018年4月26日10:36:59 Author:Marydon 设置-->Editor-->Font-->修改Fo ...

  8. eclipse Java compiler level does not match the version of the installed Java project facet.

      eclipse Java compiler level does not match the version of the installed Java project facet. Create ...

  9. 对UserDict的研究

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #对UserDict的研究 class UserDict(): def __init__(self, dict ...

  10. http 错误码对照表

    代码 指示 2xx 成功 200 正常:请求已完成. 201 正常:紧接 POST 命令. 202 正常:已接受用于处理,但处理尚未完成. 203 正常:部分信息 — 返回的信息只是一部分. 204 ...