首页 > 其他分享 >关于getClass().getClassLoader().getResourceAsStream——转载自https://www.cnblogs.com/kukudi/

关于getClass().getClassLoader().getResourceAsStream——转载自https://www.cnblogs.com/kukudi/

时间:2023-09-18 15:24:02浏览次数:55  
标签:文件 getResourceAsStream getClass cnblogs getClassLoader txt Class

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

标签:文件,getResourceAsStream,getClass,cnblogs,getClassLoader,txt,Class
From: https://www.cnblogs.com/wuye-bicycle/p/17711906.html

相关文章

  • 从cnblogs转到知乎写笔记,从评论中向大家学习
    Friday,June24,2022,11:29:29AM从cnblogs转到知乎写笔记,从评论中向大家学习本来是想把知乎账号的一句话介绍改成上面这句话的,但是在手机或者电脑上不同日期、时间尝试改了几次,都提示系统维护中。这简单的改个自我介绍都如此麻烦,让我不由得怀疑这可能不是技术问题,而是某种......
  • 捐助 cnblogs 园子的商业化努力-困境求助:开设捐助通道
    访问一个不存在的页面时,会显示“园子的商业化努力-困境求助:开设捐助通道”https://www.cnblogs.com/xiaoyaoju/archive/2013/03/05/2944929.html官方原文:https://www.cnblogs.com/cmt/p/17320765.html......
  • .super.getClass()方法调用?
    下面程序的输出结果是多少?importjava.util.Date;publicclassTestextendsDate{publicstaticvoidmain(String[]args){newTest().test();}publicvoidtest(){System.out.println(super.getClass().getName());}}答:结果是Test。原因:在test方法中,直接调用getC......
  • 请大家支持博客园,购买VIP会员,https://cnblogs.vip
    很多认识我的朋友都是读到我的文章而来的,博客园是国内最早的技术博客平台,近二十年来始终如一地保持本色,不忘初心,为广大的技术爱好者经营着一块相对干净的田地。我也是最早的一批博主之一吧,在那个物资还没有很丰富,相对单纯的年代,天南地北的朋友们,以文会友,追一些大牛的系列文章跟......
  • 解决Cnblogs-Theme-SimpleMemory应用后博客加载缓慢问题
    在应用Cnblogs-Theme-SimpleMemory(https://github.com/BNDong/Cnblogs-Theme-SimpleMemory)美化博客之后,发现博客访问缓慢,甚至直接无法加载。为解决问题,仔细观察安装应用源码后,在其安装使用说明网站(点击访问)中找到以下代码行:该网址指向CloudFlare所提供的CDN加速服务,拉取了d......
  • [2023本地存储方案](https://www.cnblogs.com/fangchaoduan/p/17608006.html)
    2023本地存储方案本地存储方案cookie本地存储:有期限的限制,可以自己设置过期期限。在期限内,不论页面刷新还是关闭,存储的信息都还会存在。localStorage本地持久化存储:页面刷新或者关闭,存储的信息一直存在,除非手动清除或者卸载浏览器,而且没有有效期的限制。sessionSto......
  • cnblogs 合集 All In One
    cnblogs合集AllInOnehttps://i.cnblogs.com/collectionsdemoscollectionshttps://www.cnblogs.com/xgqfrms/collections/4810https://www.cnblogs.com/xgqfrms/p/17369159.html(......
  • getClassLoader(),getResource()
    在Java中,`getClassLoader()`方法是`java.lang.Class`类的一个方法,它用于获取加载某个类的类加载器对象。这个方法返回的是一个`ClassLoader`类的实例。以下是`getClassLoader()`方法的源代码示例:publicClassLoadergetClassLoader(){  ClassLoadercl=getClassLoader0(......
  • Oracle日常性能问题查看 转载 https://www.cnblogs.com/yhq1314/p/10601630.html
    1判断回滚段竞争的sql--当Ratio大于2时存在回滚段竞争,需要增加更多的回滚段)selectrn.name,rs.GETS,rs.WAITS,(rs.WAITS/rs.GETS)*100ratiofromv$rollstatrs,v$rollnamernwherers.USN=rn.usn;2判断恢复日志竞争的sql,这句有问题不能使用--immediate_con......
  • CSDN这么公然爬取(piao qie)cnblogs的文章,给钱了吗?
    在CSDN网站经常看到有博客转载cnblogs的文章,开始还以为是网友自行转载,后来才发现,这些所谓的转载应该都是机器爬取(piaoqie)过去的。不知道cnblogs对此怎么看。下面看看几个示例博主发博客的时间比它注册博客的时间还早,而且转载的时间和原稿发布时间分秒不差。这爬取也太直白了......