java 类加载器读取文件_JAVA类加载器二 通过类加载器读取资源文件

一、getResourceAsStream方法

getResourceAsStream方法实现如下:

publicInputStream 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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值