1. 通过反射加载资源文件
- 加载
properties
资源文件, 只能使用Properties
类的load()
方法.
1.1. 方式 1: 用绝对路径的方式加载(写死的一个文件路径)
该方式一般来说不使用, 因为路径写死了, 不利于项目适配.
且交出项目时给的是项目的 bin 文件夹, 文件夹之外的内容是不会提供的.操作如下:
public void load1() throws Exception{ //创建一个资源对象 Properties p = new Properties(); //创建一个输入流对象用以获取文件, 注意使用绝对路径 InputStream in = new FileInputSteam("D:/file/db.properties"); //从输入流中读取属性列表, 读取后数据都存储在Properties对象中 p.load(in); }
1.2. 方式 2: 用相对路径的方式加载(相对 classpath 的根路径)
- 通过在项目中建立 resource 文件夹, 则可以把资源文件自动存在字节码文件输出目录当中.
- 字节码文件输出目录的根路径称为 classpath, 而
ClassLoader
对象就默认
从classpath
路径开始寻找文件, 注意这个根目录就是 bin 文件夹.
1.2.1. ClassLoader 类
可以通过一个
ClassLoader
对象来获取这个classpath
路径.java.lang.ClassLoader
类对象是类加载器, 是负责加载类的对象.
类中存在getResourceAsStream(String name)
方法,
可以返回读取指定资源的输入流, 因此可以用来加载资源文件.
1.2.2. 获取 ClassLoader 类对象的方式
方式 1:
在Class
类中存在getClassLoader()
方法, 可以返回指定类的类加载器.
调用实例:ClassLoader cl = TargetClass.class.getClassLoader();
方式 2:
在线程类中也存在getContextClassLoader()
可以获取目标线程的类加载器.
可以通过线程类的静态方法获取当前的线程, 然后通过当前线程获取类加载器.ClassLoader cl = Thread.currentThread().getContextClassLoader();
1.2.3. ClassLoader 对象获取资源文件实例
一般来说方式 2 是最实用的获取
ClassLoader
对象方式.public void load2()) throws Exception{ //创建一个资源对象 Properties p = new Properties(); //获取ClassLoader对象 ClassLoader cl = Thread.currentThread().getContextClassLoader(); //创建一个输入流对象用以获取ClassLoader返回的文件输入流对象, 只要给定文件名即可 InputStream in = cl.getResourceAsStream("db.properties"); //从输入流中读取属性列表, 读取后数据都存储在Properties对象中 p.load(in); }
1.3. 方式 3: 使用相对路径(相对于当前加载资源文件的字节码路径)
在
Class
类中也存在着getResourceAsStream(String name)
方法,
也可以用来查找具有给定名称的资源, 返回这个资源的输入流.但实际上这个方法和
ClassLoader
中的方法默认的寻找路径是不一样的.ClassLoader
是从 bin 文件夹这个根目录直接开始找.
因此资源文件直接存放在 bin 文件夹中即可.Class
的这是从字节码文件所在的包文件夹去寻找.
而这里的资源文件则需要存放在字节码文件所在的包当中才行.
该方法的操作应用和
ClassLoader
中的是一样的, 只是文件存放位置不一样.