如何使用Class和ClassLoader加载文件
很多时候我们都需要在程序中加载各种文件,比如在加载配置文件,加载properties文件,或者只是加载一个文本文件,然后输出其中的内容,我在初学java的时候,就对加载文件非常头疼,今天又遇见了加载文件的问题,索性就一下子搞清楚,然后就有了这篇博客,希望能帮到对加载文件有疑惑的人吧。
本文的实验环境是在idea下,但是同样适用于使用eclipse的读者。
一、什么是类路径
这篇文章主要是将怎么操作,所以概念性的东西,就不多赘述了,这里有一篇讲解类路径非常好的文章分享一下:管理 Java 类路径 (Windows)
二、加载文件
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/文件,所以第二次就加载成功了。
如果感觉文章描述的不是很清楚,可以看:讲解的视频
https://www.bilibili.com/video/av16095869/index_41.html?t=649
---------------------
作者:阿古拉斯啦啦
来源:CSDN
原文:https://blog.csdn.net/q982151756/article/details/80206574
版权声明:本文为博主原创文章,转载请附上博文链接!
如何使用Class和ClassLoader加载文件的更多相关文章
- Java中加载配置文件的集中方式,以及利用ClassLoader加载文件 .
我们往常进行文件的加载的时候 用到的都是 FileInputStream进行 文件的加载比如下面一个例子 : InputStream in=FileInputStream("1.prope ...
- 图解classloader加载class的流程及自定义ClassLoader
图解classloader加载class的流程及自定义ClassLoader 博客分类: JVM JavaJVM虚拟机EXTSUN /** * 转载请注明作者longdick http://l ...
- classloader加载过程
/** * 转载请注明作者longdick http://longdick.iteye.com * */ java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个j ...
- JVM ClassLoader加载过程
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是Java虚拟机的类加载机制. 1)三个类加载器: bootstra ...
- classloader加载的双亲委托模式
要深入了解ClassLoader,首先就要知道ClassLoader是用来干什么的,顾名思义,它就是用来加载Class文件到JVM,以供程序使用 的.我们知道,java程序可以动态加载类定义,而这个动 ...
- 使用PSR-4配合composer autoload 自动加载文件夹
require 文件很麻烦,使用PSR-4搭配composer一次加载,终生受用. 感觉类似java中的import了,自己先记录一下最近理解的. 用composer管理自己的包吧 安装compose ...
- ClassLoader加载资源时的搜索路径
先来个例子: /** * 测试classloader加载路径在哪里<p> * main3 */ public static void main3(String[] args) { Prop ...
- Java ClassLoader加载机制理解
今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...
- classloader加载class的流程及自定义ClassLoader
java应用环境中不同的class分别由不同的ClassLoader负责加载.一个jvm中默认的classloader有Bootstrap ClassLoader.Extension ClassLoa ...
随机推荐
- graph embedding 之 struc2vec
在现实的网络中,构成网络的每个节点可能在网络中担任着某种角色.比如社交网络中,经常可以看见一些关注量很高的大V.两个大V在网络中的角色可能相同,因为他们都有很高的关注量:而大V与普通人(仅有几个关注) ...
- MiniUI表单验证总结
原文地址:https://www.cnblogs.com/wllcs/p/5607890.html 1,页面效果图 2,代码实现 <!DOCTYPE html PUBLIC "-/ ...
- javaweb--Rest访问(RestTemplate)
Rest访问(RestTemplate)在实际的项目中,往往需要发送一个Get/Post请求到其他的系统(Rest API),比如向人员管理部门请求,然后解析返回信息获取该用户的基本信息等.JDK传统 ...
- 替换分隔符 ^p, 或者是回车
1 Excel 里面的数据, 粘出来到notepad上,再从notepad 粘到word, 再把world里面的分隔符或者是回车符替换成 其他的 .
- Flutter BottomNavigationBar 组件
BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,bottomNavigationBar是 Scaffold 组件的参数. BottomNavigationBar ...
- zookeeper使用过程的错误
一.zookeeper启动成功,dubbo服务也注册成功,但是服务消费者调用失败 报错如下: [myid:] - INFO [SyncThread:0:ZooKeeperServer@645] - E ...
- 算法习题---5.6团体队列(Uva540)
一:题目 有t个队伍的人正在排队,每次新来一个人,如果他有队友在排队,那他可以插队,直接排到他的队伍的末尾.如果没有队伍在前面,那么他直接排在长队的末尾 ENQUEUE x 将编号x的队员入队 DEQ ...
- 【427】Graph 实现 以及 DFS & BFS
目录: Graph 实现 二维数组实现 Linked List 实现 DFS:深度优先搜索 stack 实现 recursion 实现 BFS:广度优先搜索(queue) 其他应用 非连通图遍历 - ...
- Spring Cloud简介 4.1
什么是Spring Cloud Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集.该工具集为微服务架构中所涉及的配置管理.服务发现.智能路由.断路器.微 ...
- Swoole练习 UDP
UDP 服务代码 <?php //创建Server对象,监听 127.0.0.1:9502端口,类型为SWOOLE_SOCK_UDP $serv = new swoole_server(&quo ...