- 如何在类路径下获取文件的绝对路径
- 以流的形式直接返回路径
- 更直接:一步到位之资源绑定器的使用
- 类加载机制
- 双亲委派模型
public static void main(String[] args) throws Exception {
//这种路径的缺点:移植性差,在IDEA中默认的当前路径是project的根
//离开了IDEA,这个路径就无效
// FileReader reader=new FileReader("src/main/resources/classinfo2.properties");
//Thread.currentThread() 当前线程对象
//getContextClassLoader() 线程对象的方法 可以获取到当前线程的类加载器对象
//getResource() 类加载器的方法,当前线程的类加载器默认从类的根路径下加载资源
String path=Thread.currentThread().getContextClassLoader().getResource("classinfo2.properties").getPath();
//采用以上的代码就可以拿到文件的绝对路径
// /C:/Users/apple/Desktop/bite-learning-2022-master/java100/untitled/target/classes/classinfo2.properties
System.out.println(path);
}
以流的形式直接返回路径
public static void main(String[] args) throws Exception{
//获取文件的绝对路径
//方式一:拿到文件的绝对路径,然后自己创建一个文件流
// String path=Thread.currentThread().getContextClassLoader().getResource("classinfo2.properties").getPath();
// FileReader reader=new FileReader(path);
//用绝对路径也有一个缺点:只能在Windows下运行,如果换到linux就运行不了
//方式二:直接以流的形式返回
InputStream reader=Thread.currentThread().getContextClassLoader().getResourceAsStream("classinfo2.properties");
Properties pro=new Properties();
pro.load(reader);
reader.close();
//通过key来获取value
String className=pro.getProperty("className");
System.out.println(className);
}
更直接:一步到位之资源绑定器的使用
创建一个配置文件在IDEA的src/resources目录下
资源绑定器是用来获取配置文件、资源文件的,
不是用来获取.java文件的
public static void main(String[] args) {
//资源绑定器的使用
//在java.util包下提供了资源绑定器,便于获取属性配置文件中的内容
//使用一下这种方式的时候,属性配置文件xxx.properties必须放到类路径下.
//只能绑定xxx.properties文件。并且这个文件必须在类路径下,文件扩展名也必须是properties
//就是这个文件必须在src路径下(默认搜索路径是src),如果文件不是直接在src下,而是在其子目录中,则需要写出访问的相对路径
//指明是哪个文件时,不用加文件扩展名
ResourceBundle bundle=ResourceBundle.getBundle("123");
String s=bundle.getString("classMyName");
System.out.println(s);
// ResourceBundle bundle=ResourceBundle.getBundle("classinfo2");
// String className=bundle.getString("className");
// System.out.println(className);
}
类加载机制
-
什么是类加载器?
专门负责加载类的命令/工具
ClassLoader -
JDK中有三个类加载器
启动类加载器(父加载器)
扩展类加载器(母加载器)
应用类加载器 -
假设有这样代码:
String s=“abc”;
代码开始执行前,会将所需要的类加载到JVM中,通过类加载器进行加载,先找到String.class字节码文件,找到就加载
如何加载?
先通过“启动类加载器”进行加载,启动类加载器专门加载rt.jar包下
rt.jar包中都是JDK最核心的类库.
(位置在jdk/jre/lib中)
如果启动类加载器加载不到,会通过“扩展类加载器”进行加载
扩展类加载器专门加载ext中的所有jar包
(位置在JDK/jre/lib/ext)
如果扩展类加载器也没有加载到,会通过“应用类加载器”进行加载
应用类加载器专门加载classpath中的jar包
(就是配置环境变量时用到的那个)
启动类加载器又被称为父加载器
扩展类加载器又被称为母加载器
这种加载机制又被称为“双亲委派模型”
-
机制介绍
为了保证类加载安全,才有了双亲委派机制. -
优先从父中加载,父无法加载到,再从扩展类加载器中加载,如果都加载不到,再考虑从应用类加载器中加载
这是一种安全机制,比如如果启动类中有String,而你自己写的应用类中也有一个String,如果不是按顺序加载,黑客如果在应用类中的String中植入了后门程序,那直接凉凉…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)