目录标题
- 一、通过类加载器获取resources目录
- (一)获取resources的根目录
- (二)URL
- (三)获取resources目录下指定文件
- 二、获取resources目录下文件操作流(推荐使用这个方式操作resources目录下的文件)
- (一)getResource()方法的缺点
- (二)getResourceAsStream(String path)
- 三、Class.getResource("")
- 四、对应关系
一、通过类加载器获取resources目录
(一)获取resources的根目录
public static void main(String[] args) {
//BrokerConfig 为类名
System.out.println(BrokerConfig.class.getClassLoader().getResource("").getPath());
}
输出:
/D:/lihua/javacode/jmqtt/iot-jmqtt/code/target/classes/
也就是这个目录。我们代码编译后会将class文件和resources目录下的文件放到classes目录下
(二)URL
注意:getResource("")返回的对象类型是URL不是URI
//调用.getResource("")后可以获取到URL对象。这个对象里面有许多方法,不仅仅能获取目录,还能获取File、URI等对象
URL resource = BrokerConfig.class.getClassLoader().getResource("");
可调用的方法如下:
(三)获取resources目录下指定文件
当然【getResource()】也可以携带文件目录参数:
我们也可以直接获取到具体文件的路径
public static void main(String[] args) {
String path = BrokerConfig.class.getClassLoader().getResource("conf/jmqtt.properties").getPath();
System.out.println(path);
}
输出:
/D:/lihua/javacode/jmqtt/iot-jmqtt/code/target/classes/conf/jmqtt.properties
二、获取resources目录下文件操作流(推荐使用这个方式操作resources目录下的文件)
(一)getResource()方法的缺点
注意:使用getResource()获取resources文件目录的方式,在一般情况下是可以正常操作文件的,但是当你将项目打包成jar包后,通过这种方式获取到的目录是无法操作文件的
如下:当项目打包成jar后运行,会报找不到资源文件的FileNotException异常。
我们查看jar里面的资源目录:
我们通过getResource()获取到的资源目录似乎是正确的。其实并不是这样的,因为jar包是一个特殊的压缩包。通过下面的路径,是无法操作到jar包内部的文件的。
java.io.FileNotFoundException:
file:\D:\lihua\javacode\jmqtt\iot-jmqtt\code\target\code-3.0.0.jar!\BOOT-INF\classes!\conf\jmqtt.properties
类加载器还为我们提供了另外一个方法用来操作Resource目录下的配置文件资源。
(二)getResourceAsStream(String path)
getResourceAsStream(String path) 这个方法可以直接获取到Resource目录下文件的输入流,并且这种方式在jar环境下也能正常使用
。
public static void main(String[] args) {
InputStream resourceAsStream = BrokerConfig.class.getClassLoader().getResourceAsStream("conf/jmqtt.properties");
Properties properties = new Properties();
try {
properties.load(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(properties.getProperty("anonymousEnable"));
}
输出:
true
三、Class.getResource("")
值得注意的是Calss类也有一个getResource("")。这个方法是用来获取【.class】文件的。
public static void main(String[] args) {
String path = BrokerConfig.class.getResource("").getPath();
System.out.println(path);
}
输出:
/D:/lihua/javacode/jmqtt/iot-jmqtt/code/target/classes/org/jmqtt/broker/common/config/
这个目录也就是
四、对应关系
在运行环境下,我们更多会操作classs文件下的资源。比如jar包,打包好后,如果通过getResourceAsStream(String path)定位资源,那么不管你将jar发到哪个目录下运行都是可行的。【也就是会动态获取路径
】