项目中,有时候要读取当前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");

 

转载于:https://www.cnblogs.com/lujiango/p/9674392.html

Class.getResourceAsStream和ClassLoader.getResourceAsStream方法相关推荐

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

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

  2. java getresources方法_Java ClassLoader getResources()方法与示例

    ClassLoader类getResources()方法getResources()方法在java.lang包中可用. getResources()方法用于标识具有给定资源名称的所有资源. getRe ...

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

    1:报错如下 2:分析 3:解释 使用Spring的ClassPathResource来读取maven项目resource下的文件 一般来说,我们项目的配置文件及静态资源都会放置在resources目 ...

  4. 我的Java开发学习之旅------JAVA 笔记ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别...

    今天,一读者在我的 Android通过调用Webservice实现手机号码归属地查询 文章中给我回复了一个问题,由于没有具体说明我的sop12.xml文件是放在src目录下,不是和具体操作类Addre ...

  5. android防治方法被反射,通过去classLoader避免Android P反射限制后还原classLoader的方法...

    [Java] 纯文本查看 复制代码/** * 恢复classloader:清除loader可能会造成问题 * (java.lang.NoClassDefFoundError: Class not fo ...

  6. java读取properties文件_java读取properties文件的几种方法

    一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取 1 Properties p=newProperties() ...

  7. Java文件路径(getResource)

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

  8. java文件放在哪里_Java文件路径

    几大常用的方法 Class.getResource("")    返回的是当前Class这个类所在包开始的位置 getClassLoader().getResource(" ...

  9. RCP 获得图片路径

    Class.getResourceAsStream 和 ClassLoader.getResourceAsStream 这两个方法还是略有区别的, 以前一直不加以区分,直到今天发现要写这样的代码的时候 ...

最新文章

  1. jdk紧急漏洞,XMLDecoder反序列化攻击
  2. python import 路径_Python 从相对路径下import的方法
  3. 视不可当:信息图与可视化传播
  4. 月薪5万的产品经理都把什么能力放在第一位?
  5. 如何使用Database2Sharp进行代码生成
  6. mysql close 出错_MySQL错误Forcing close of thread的两种解决方法
  7. XML文档的使用方法
  8. 使用ECMAScript 5严格模式提升开发效率
  9. python实现QQ机器人(自动登录,获取群消息,发送群消息)
  10. ZZNUOJ_C语言1007:鸡兔同笼(完整代码)
  11. 图片去水印方法(不用下载任何东西)
  12. Shopee虾皮怎么发货?虾皮物流
  13. ReactOS 分析一
  14. 连连支付提现人民币的时候汇率是怎么样的?
  15. android 对话框 美化,Android修改Dialog样式
  16. 《我是一只IT小小鸟》目录I
  17. python逐步回归筛选变量_统计学干货 I 逐步回归
  18. 06_多窗口文档编辑器(小钱版)[Qt开发][2012-03-07]
  19. Java:反射机制学习
  20. 锐捷交换机的端口配置状态

热门文章

  1. STL_Hash_map
  2. 超图球面与平面场景的区别和地理坐标系
  3. Linux dmesg 命令学习
  4. Windows驱动开发-_驱动对象学习和内核处理字符串初步
  5. Fedora学习总结
  6. 18年总结及19年展望
  7. log4j 配置详解
  8. 为博客园博文添加目录的两种方法
  9. [dts]TI-am437x dts
  10. 数据库系统概念学习笔记2