关于getClass().getClassLoader().getResourceAsStream

本文详细探讨了Java中getClassLoader()和Class.getResourceAsStream()在加载资源文件时的区别。通过示例代码展示了如何正确加载resources目录下的文件,强调了路径前缀在不同加载方式下的重要性。总结了两种加载方式对路径的理解,帮助理解类装载器的工作原理。
摘要由CSDN通过智能技术生成

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/文件,所以第二次就加载成功了。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值