关于getClass().getClassLoader().getResourceAsStream
InputStream is = getClass().getClassLoader().getResourceAsStream("helloworld.properties");
getClass()
:取得当前对象所属的Class对象
getClassLoader()
:取得该Class对象的类装载器
类装载器负责从Java字符文件将字符流读入内存,并构造Class类对象,所以通过它可以得到一个文件的输入流。
装载类的过程非常简单:查找类所在位置,并将找到的Java类的字节码装入内存,生成对应的Class对象。
Java的类装载器专门用来实现这样的过程,JVM并不止有一个类装载器,事实上,如果你愿意的话,你可以让JVM拥有无数个类装载器,当然这除了测试JVM外,我想不出还有其他的用途。
Class.getClassLoader()的一个小陷阱:
Integer.class.getClassLoader().getResource("\**\**\**\**\*");
抛出空指针异常,定位为getClassLoader()返回null
加载文件示例
1、使用ClassLoader
加载文件
这里演示的加载1.txt
文件,文件内容是Hello,world
文件结构如下:
![这里写图片描述](images/新建 Markdown File.assets/70.png)
这里可以发现在idea
中所有放到resources
文件夹下的文件,都会被放到target\classes
下。
代码:
import org.apache.commons.io.IOUtils;
import java.io.InputStream;
/**
* Created by Yifan Jia on 2018/5/5.
*/
public class AJava {
public static void main(String[] args) throws Exception {
AJava a = new AJava();
ClassLoader cl = a.getClass().getClassLoader();
InputStream in = cl.getResourceAsStream("1.txt");
String s = IOUtils.toString(in);
System.out.println(s);
}
}
结果:
2、使用Class
加载文件
如果我们这样写:
package com.first;
import java.io.InputStream;
/**
* Created by Yifan Jia on 2018/5/5.
*/
public class BJava {
public static void main(String[] args) throws Exception {
BJava b = new BJava();
Class bClass = b.getClass();
InputStream in = bClass.getResourceAsStream("1.txt");
String s = IOUtils.toString(in);
System.out.println(s);
}
}
就会出现错误,提示找不到文件:
我们修改一下代码:
package com.first;
import org.apache.commons.io.IOUtils;
import java.io.InputStream;
/**
* Created by Yifan Jia on 2018/5/5.
*/
public class BJava {
public static void main(String[] args) throws Exception {
BJava b = new BJava();
Class bClass = b.getClass();
InputStream in = bClass.getResourceAsStream("/1.txt");
String s = IOUtils.toString(in);
System.out.println(s);
}
}
注意这里只是比上一个代码多了一个/
符号
结果:
三、总结
1、使用ClassLoader
加载文件时,在getResourceAsStream("")
中填入的路径是相对于
classes/
文件下的,比如我们写一个getResourceAsStream("1.txt")
,其实对应的是盘符:...\项目名\target\classes\1.txt
文件。(如果是eclipse
则是在相应的classes
下)
2、使用Class
加载文件时,在getResourceAsStream("")
中填入的路径是相对于
当前的.class
文件所在的目录,比如我们写一个getResourceAsStream("1.txt")
,其实对应的是盘符:...\项目名\target\classes\com\first\1.txt
文件,在上面的例子中,应为改路径下没有1.txt
文件,所有会提示错误。但是当我们在文件前加一个\
符号时getResourceAsStream("/1.txt")
,就会变成和使用ClassLoader
一样,变成相对于
classes/
文件,所以第二次就加载成功了。