java踩坑记-getResourceAsStream
本文主要是研究下面集中方法到底谁才能真正的load到文件,你能一眼看出来吗?
目录结构:
代码:
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));}} }
结果:
结论:
- Class.getResourceAsStream 最终调用的是此Class的Class Loader的getResourceAsStream来进行读文件(有些绕,尽量理解)
- GetResourcesSample.class.getClass() 得到的是Class这个类的实例,它的ClassLoader是JVM的bootstrap Class Loader
- 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;}
- project-root-file.txt这种最后最终不被打在Jar包里的文件,是没有机会被读取的,除非hard code一个文件所在的绝对路径
- 把相同代码放到UT里面去跑,会发现UT能同时load到main和test下的文件。因为JUnit有它自己的ClassLoader,它能同时读到main和test下的文件。
转载于:https://www.cnblogs.com/ydjfish/p/8052575.html
java踩坑记-getResourceAsStream相关推荐
- java getresourceasstream null_java踩坑记-getResourceAsStream
本文主要是研究下面集中方法到底谁才能真正的load到文件,你能一眼看出来吗? GetResourcesSample.class.getClassLoader.getResourceAsStream(& ...
- 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题
❝ 本系列每篇文章都是从一些实际的 case 出发,分析一些生产环境中经常会遇到的问题,抛砖引玉,以帮助小伙伴们解决一些实际问题.本文介绍 Flink 时间以及时区问题,分析了在天级别的窗口时会遇到的 ...
- Spring @Transactional踩坑记
@Transactional踩坑记 总述 Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@Transactional注解,实现事务 ...
- Spark踩坑记——数据库(Hbase+Mysql)转
转自:http://www.cnblogs.com/xlturing/p/spark.html 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库 ...
- Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记
前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...
- windos下 elasticksearch7.13安装踩坑记
windos下 elasticksearch7.13安装踩坑记 一,环境配置 环境要求 java jdk16下载安装 elasticksearch7.13下载安装 遇到的问题 (待更新) 一,环境配置 ...
- spug上线服务踩坑记
spug是一款优秀的自动化运维平台, 这让我们想自动化又向前迈了一步. 在过程中遇到的问题,记录在这里供各位看官参考. 目录 一.远程执行命令问题 二.软连接的问题 三.jdk 版本问题 四.ssh ...
- Go 语言踩坑记——panic 与 recover
题记 Go 语言自发布以来,一直以高性能.高并发著称.因为标准库提供了 http 包,即使刚学不久的程序员,也能轻松写出 http 服务程序. 不过,任何事情都有两面性.一门语言,有它值得骄傲的优点, ...
- python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django
<>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...
- 服务器重新部署踩坑记
服务器重新部署踩坑记 Intro 之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除 ...
最新文章
- python 使用 struct 把数据变成字节流
- 使用DotNetBar制作漂亮的WinFrom界面,自定义AgileEAS.NET SOA平台WinClient主界面
- tp5 excel 导入 mysql_TP5框架下MySQL通过LOAD DATA INFILE批量导入数据详细操作
- 计算机组网技术与配置 pdf,教案计算机组网技术.pdf
- “短路求值(Short-Circuit Evaluation)
- 2016/8/18 Linux常用命令 :目录、文件处理命令
- android WIFI信息获取
- 分布式Session解决方案_Spring Session + Redis
- 【2015 NEERC - G 】Garden Gathering【距离计算变形、数学巧妙转换】
- 交易系统开发(七)——交易延迟分析
- 如何查看 Swift 的源代码
- 单点登录原理与简单实现
- Jmeter HTTP Proxy Server 代理录制 IE无法录制到请求的问题解决
- STL之算法——排序算法
- 国内服务器带宽价格是多少?国内服务器带宽为什么贵?
- 扫地机器人漫谈(一):扫地机的形状
- Lookahead、LazyOptimizer、MaskedAdamOptimizer、AdaBound
- https证书不安全是什么原因?
- 记一次太阳神三国杀的编译
- CES 2022、量子安全和激光雷达
热门文章
- GB-T 15834-2011《标点符号用法》文档的格式问题
- 在某龙芯平台上编译FFMPEG报错:ERROR: xxx not found using pkg-config
- configure: error: Package requirements (commoncpp 6.2.2) were not met
- eclipse不能调试某个文件的解决办法
- 实际测试中,经常发现摄像头断线几分钟
- 一以贯之是一个思想家成熟的标志
- 《TensorFlow技术解析与实战》学习笔记1
- 有东西,可以倚老卖老,可以倚少卖少
- ap计算机科学ab,AP微积分AB_AP科目介绍|AP考试网
- 视觉平衡与物理平衡_简单聊聊摄影“视觉平衡”那些事