加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何使用Class和ClassLoader加载文件

发布时间:2020-12-15 05:30:34 所属栏目:Java 来源:网络整理
导读:很多时候我们都需要在程序中加载各种文件,比如在加载配置文件,加载properties文件,或者只是加载一个文本文件,然后输出其中的内容,我在初学java的时候,就对加载文件非常头疼,今天又遇见了加载文件的问题,索性就一下子搞清楚,然后就有了这篇博客,希

很多时候我们都需要在程序中加载各种文件,比如在加载配置文件,加载properties文件,或者只是加载一个文本文件,然后输出其中的内容,我在初学java的时候,就对加载文件非常头疼,今天又遇见了加载文件的问题,索性就一下子搞清楚,然后就有了这篇博客,希望能帮到对加载文件有疑惑的人吧。
本文的实验环境是在idea下,但是同样适用于使用eclipse的读者。

一、什么是类路径
这篇文章主要是将怎么操作,所以概念性的东西,就不多赘述了,这里有一篇讲解类路径非常好的文章分享一下:管理 Java 类路径 (Windows)

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

如果感觉文章描述的不是很清楚,可以看:讲解的视频

https://www.bilibili.com/video/av16095869/index_41.html?t=649--------------------- 作者:阿古拉斯啦啦 来源:CSDN 原文:https://blog.csdn.net/q982151756/article/details/80206574 版权声明:本文为博主原创文章,转载请附上博文链接!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读