感谢原文作者:不将就!

原文链接:https://www.cnblogs.com/byron0918/p/5770684.html

一、getResourceAsStream方法

getResourceAsStream方法实现如下:

public InputStream getResourceAsStream(String name) {
URL url = getResource(name);
try {
return url != null ? url.openStream() : null;
} catch (IOException e) {
return null;
}
}

可见getResourceAsStream方法中调用了getResource方法来查找指定的资源。

再看getResource的源代码:

public URL getResource(String name) {
URL url;
if (parent != null) {
url = parent.getResource(name);
} else {
url = getBootstrapResource(name);
}
if (url == null) {
url = findResource(name);
}
return url;
}

因为Bootstrap是顶层的classloader,所以java中定义它的parent为null。

此处先判断parent是不是null,如果parent不是null说明这个class的ClassLoader不是boostrap。

另外通过parent.getResource(name);这一句发现classloader会一直调用它的父类的getResource方法,这和classloader的父类加载机制是一致的。

换句话说,读取资源文件的时候,目录的搜索顺序是

JRE/lib/rt.jar 注意,搜索的是jar包内的内容,jar包外面的同级目录不在搜索范围内

JRE/lib/ext/*.jar

Classpath目录

而且,如果上级路径和下级路径如果同时存在要搜索的资源,那么将以上级路径下的资源作为搜索结果。

示例:

InputStream in = QuickStart.class.getClassLoader().getResourceAsStream("haha.txt");
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br =new BufferedReader(isr);
String s = null;
while(null != (s = br.readLine())){
System.out.println(s);
}

对于多线程写法,要用下面的线程上下文的方式读取:

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("haha.txt");

补充

  • Thread中的currentThread方法,返回当前正在执行的线程对象。

  • Thread中的getContextClassLoader方法,默认返回调用线程的上下文ClassLoader。



注意:要注意资源获取时路径问题!

JAVA类加载器二 通过类加载器读取资源文件的更多相关文章

  1. 使用ServletContext对象读取资源文件

    备注:本文以properties文件为例 一.通过ServletContext读取文件 1.通过ServletContext读取放置在src下的properties文件 package com; im ...

  2. 用类加载器的5种方式读取.properties文件

    用类加载器的5中形式读取.properties文件(这个.properties文件一般放在src的下面) 用类加载器进行读取:这里采取先向大家讲读取类加载器的几种方法:然后写一个例子把几种方法融进去, ...

  3. java 从jar包中读取资源文件

    在代码中读取一些资源文件(比如图片,音乐,文本等等),在集成环境(Eclipse)中运行的时候没有问题.但当打包成一个可执行的jar包(将资源文件一并打包)以后,这些资源文件找不到,如下代码: Jav ...

  4. (转)java 从jar包中读取资源文件

    (转)java 从jar包中读取资源文件 博客分类: java   源自:http://blog.csdn.net/b_h_l/article/details/7767829 在代码中读取一些资源文件 ...

  5. Java-Servlet--《12-WEB应用中的普通Java程序如何读取资源文件.mp4》 有疑问

    \第五天-servlet开发和ServletConfig与ServletContext对象\12-WEB应用中的普通Java程序如何读取资源文件.mp4; 多层时,DAO为了得到资源文件中的配置参数: ...

  6. WEB应用中普通java代码如何读取资源文件

    首先: 资源文件分两种:后缀.xml文件和.properties文件 .xml文件:当数据之间有联系时用.xml .properties文件:当数据之间没有联系时用.properties 正题:   ...

  7. WEB应用中的普通Java程序如何读取资源文件

    package cn.itcast; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Serv ...

  8. Java/JavaWeb中读取资源文件

    1.一般工程中使用I/O类指定文件的绝对路径读取 FileInputStream fis = new FileInputStream("src/main/resources/zsm.prop ...

  9. 深入jar包:从jar包中读取资源文件getResourceAsStream

    一.背景 我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等). 在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不 ...

随机推荐

  1. partial write bypass PIE

    第一篇博客,请允许我水一下.BUUCTF上的一题:linkctf_2018.7_babypie 检查一下保护机制: 1 Arch: amd64-64-little 2 RELRO: Partial R ...

  2. Web前端浏览器默认样式重置(CSS Tools: Reset CSS)

    /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) */ html, ...

  3. JavaScript交互式网页设计 • 【第2章 JavaScript函数与事件】

    全部章节   >>>> 本章目录 2.1 JavaScript 自定义函数 2.1.1 函数的定义 2.1.2 函数的调用 2.1.3 函数的参数 2.1.4 函数的返回值 2 ...

  4. 「旅游信息管理系统」 · Java Swing + MySQL 开发

    代码写得烂,写博客纯属记录! 微信公众号:BugLass 码云仓库地址:https://gitee.com/ynavc/tourism_sys 源代码及文档打包下载:https://download. ...

  5. 从0开始手把手带你入门Vue3-全网最全(1.1w字)

    天命不足畏,祖宗不足法. --王安石 前言 本文并非标题党,而是实实在在的硬核文章,如果有想要学习Vue3的网友,可以大致的浏览一下本文,总体来说本篇博客涵盖了Vue3中绝大部分内容,包含常用的Com ...

  6. Redis_安装配置(2)

    一.安装gcc依赖 由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装 $ yum install -y gcc 上面命令 ...

  7. linux安装mysql以及使用navicat连接mysql

    一.下载mysql 1.获取下载链接 进入官网:https://www.mysql.com 点击downloads --> MySQL Community (GPL) Downloads  -- ...

  8. react中antd+css Module一起使用

    antd 和 css modules 不能混用,针对antd的css 单独写一条loader的规则,不开启 css modules. 使用 exclude 和 include 配置参考(https:/ ...

  9. Vue下路由History mode 出现404,无法正常刷新

    在History mode下,如果直接通过地址栏访问路径,那么会出现404错误,这是因为这是单页应用(废话)-其实是因为调用了history.pushState API 所以所有的跳转之类的操作都是通 ...

  10. POJ2891Strange Way to Express Integers

    http://poj.org/problem?id=2891 实际上就是一个一元线性同余方程组.按照合并的方式来解即可. 有一个注意点,调用函数是会慢的. #include<iostream&g ...