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 文件结构如下: 这里可以发现在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/文件,所以第二次就加载成功了。