本文主要是研究下面集中方法到底谁才能真正的load到文件,你能一眼看出来吗?

GetResourcesSample.class.getClassLoader.getResourceAsStream("main-resources-file.txt") 
GetResourcesSample.class.getClass().getResourceAsStream("main-resources-file.txt") 
GetResourcesSample.class.getResourceAsStream("main-resources-file.txt") 
GetResourcesSample.class.getClassLoader.getResourceAsStream("/main-resources-file.txt") 
GetResourcesSample.class.getClass().getResourceAsStream("/main-resources-file.txt") 
GetResourcesSample.class.getResourceAsStream("/main-resources-file.txt") 
很晕吧,反正我是挺晕的。

目录结构:

代码:

public class GetResourcesSample {private static final String MAIN_FILE = "main-resources-file.txt";private static final String MAIN_FILE_WITH_SLASH = "/main-resources-file.txt";private static final String TEST_FILE = "test-resources-file.txt";private static final String TEST_FILE_WITH_SLASH = "/test-resources-file.txt";private static final String ROOT_FILE = "project-root-file.txt";private static final String ROOT_FILE_WITH_SLASH = "./project-root-file.txt";public static void main(String[] args) {validateResult(MAIN_FILE);validateResult(MAIN_FILE_WITH_SLASH);validateResult(TEST_FILE);validateResult(TEST_FILE_WITH_SLASH);validateResult(ROOT_FILE);validateResult(ROOT_FILE_WITH_SLASH);}private static void validateResult(String file) {InputStream inputStream1 = GetResourcesSample.class.getClass().getResourceAsStream(file);if (inputStream1 != null) {System.out.println(MessageFormat.format("GetResourcesSample.class.getClass().getResourceAsStream(\"{0}\") is not null!", file));}InputStream inputStream2 = GetResourcesSample.class.getResourceAsStream(file);if (inputStream2 != null) {System.out.println(MessageFormat.format("GetResourcesSample.class.getResourceAsStream(\"{0}\") is not null!", file));}InputStream inputStream3 = GetResourcesSample.class.getClassLoader().getResourceAsStream(file);if (inputStream3 != null) {System.out.println(MessageFormat.format("GetResourcesSample.class.getClassLoader().getResourceAsStream(\"{0}\") is not null!", file));}}
}

结果:

GetResourcesSample.class.getClassLoader().getResourceAsStream("main-resources-file.txt") is not null!
GetResourcesSample.class.getClass().getResourceAsStream("/main-resources-file.txt") is not null!
GetResourcesSample.class.getResourceAsStream("/main-resources-file.txt") is not null!

结论:

  1. Class.getResourceAsStream 最终调用的是此Class的Class Loader的getResourceAsStream来进行读文件(有些绕,尽量理解)
  2. GetResourcesSample.class.getClass() 得到的是Class这个类的实例,它的ClassLoader是JVM的bootstrap Class Loader
  3. GetResourcesSample.class.getResourceAsStream 由于去resolve了一下name,虽然是当前class的ClassLoader,它也读不到这个文件;除非你的文件名以“/”开头。详见源代码:
        /*** Add a package name prefix if the name is not absolute Remove leading "/"* if name is absolute*/private String resolveName(String name) {if (name == null) {return name;}if (!name.startsWith("/")) {Class<?> c = this;while (c.isArray()) {c = c.getComponentType();}String baseName = c.getName();int index = baseName.lastIndexOf('.');if (index != -1) {name = baseName.substring(0, index).replace('.', '/')+"/"+name;}} else {name = name.substring(1);}return name;}

  4. project-root-file.txt这种最后最终不被打在Jar包里的文件,是没有机会被读取的,除非hard code一个文件所在的绝对路径
  5. 把相同代码放到UT里面去跑,会发现UT能同时load到main和test下的文件。因为JUnit有它自己的ClassLoader,它能同时读到main和test下的文件。

转载于:https://www.cnblogs.com/ydjfish/p/8052575.html

java踩坑记-getResourceAsStream相关推荐

  1. java getresourceasstream null_java踩坑记-getResourceAsStream

    本文主要是研究下面集中方法到底谁才能真正的load到文件,你能一眼看出来吗? GetResourcesSample.class.getClassLoader.getResourceAsStream(& ...

  2. 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题

    ❝ 本系列每篇文章都是从一些实际的 case 出发,分析一些生产环境中经常会遇到的问题,抛砖引玉,以帮助小伙伴们解决一些实际问题.本文介绍 Flink 时间以及时区问题,分析了在天级别的窗口时会遇到的 ...

  3. Spring @Transactional踩坑记

    @Transactional踩坑记 总述 ​ Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@Transactional注解,实现事务 ...

  4. Spark踩坑记——数据库(Hbase+Mysql)转

    转自:http://www.cnblogs.com/xlturing/p/spark.html 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库 ...

  5. Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记

    前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...

  6. windos下 elasticksearch7.13安装踩坑记

    windos下 elasticksearch7.13安装踩坑记 一,环境配置 环境要求 java jdk16下载安装 elasticksearch7.13下载安装 遇到的问题 (待更新) 一,环境配置 ...

  7. spug上线服务踩坑记

    spug是一款优秀的自动化运维平台,  这让我们想自动化又向前迈了一步. 在过程中遇到的问题,记录在这里供各位看官参考. 目录 一.远程执行命令问题 二.软连接的问题 三.jdk 版本问题 四.ssh ...

  8. Go 语言踩坑记——panic 与 recover

    题记 Go 语言自发布以来,一直以高性能.高并发著称.因为标准库提供了 http 包,即使刚学不久的程序员,也能轻松写出 http 服务程序. 不过,任何事情都有两面性.一门语言,有它值得骄傲的优点, ...

  9. python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django

    <>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...

  10. 服务器重新部署踩坑记

    服务器重新部署踩坑记 Intro 之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除 ...

最新文章

  1. python 使用 struct 把数据变成字节流
  2. 使用DotNetBar制作漂亮的WinFrom界面,自定义AgileEAS.NET SOA平台WinClient主界面
  3. tp5 excel 导入 mysql_TP5框架下MySQL通过LOAD DATA INFILE批量导入数据详细操作
  4. 计算机组网技术与配置 pdf,教案计算机组网技术.pdf
  5. “短路求值(Short-Circuit Evaluation)
  6. 2016/8/18 Linux常用命令 :目录、文件处理命令
  7. android WIFI信息获取
  8. 分布式Session解决方案_Spring Session + Redis
  9. 【2015 NEERC - G 】Garden Gathering【距离计算变形、数学巧妙转换】
  10. 交易系统开发(七)——交易延迟分析
  11. 如何查看 Swift 的源代码
  12. 单点登录原理与简单实现
  13. Jmeter HTTP Proxy Server 代理录制 IE无法录制到请求的问题解决
  14. STL之算法——排序算法
  15. 国内服务器带宽价格是多少?国内服务器带宽为什么贵?
  16. 扫地机器人漫谈(一):扫地机的形状
  17. Lookahead、LazyOptimizer、MaskedAdamOptimizer、AdaBound
  18. https证书不安全是什么原因?
  19. 记一次太阳神三国杀的编译
  20. CES 2022、量子安全和激光雷达

热门文章

  1. GB-T 15834-2011《标点符号用法》文档的格式问题
  2. 在某龙芯平台上编译FFMPEG报错:ERROR: xxx not found using pkg-config
  3. configure: error: Package requirements (commoncpp 6.2.2) were not met
  4. eclipse不能调试某个文件的解决办法
  5. 实际测试中,经常发现摄像头断线几分钟
  6. 一以贯之是一个思想家成熟的标志
  7. 《TensorFlow技术解析与实战》学习笔记1
  8. 有东西,可以倚老卖老,可以倚少卖少
  9. ap计算机科学ab,AP微积分AB_AP科目介绍|AP考试网
  10. 视觉平衡与物理平衡_简单聊聊摄影“视觉平衡”那些事