我是靠谱客的博主 高兴电脑,最近开发中收集的这篇文章主要介绍关于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
文件结构如下:
这里写图片描述
这里可以发现在idea中所有放到resources文件夹下的文件,都会被放到targetclasses下。
代码:


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"),其实对应的是盘符:...项目名targetclasses1.txt文件。(如果是eclipse则是在相应的classes下)

2、使用Class加载文件时,在getResourceAsStream("")中填入的路径是相对于
当前的.class文件所在的目录,比如我们写一个getResourceAsStream("1.txt"),其实对应的是盘符:...项目名targetclassescomfirst1.txt文件,在上面的例子中,应为改路径下没有1.txt文件,所有会提示错误。但是当我们在文件前加一个符号时getResourceAsStream("/1.txt"),就会变成和使用ClassLoader一样,变成相对于
classes/文件,所以第二次就加载成功了。

 

最后

以上就是高兴电脑为你收集整理的关于getClass().getClassLoader().getResourceAsStream的全部内容,希望文章能够帮你解决关于getClass().getClassLoader().getResourceAsStream所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部