标签:
一、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");
标签:
原文地址:http://www.cnblogs.com/byron0918/p/5770684.html