码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-08-14 19:20:09      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:

一、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");

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

标签:

原文地址:http://www.cnblogs.com/byron0918/p/5770684.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!