目录标题

  • 一、通过类加载器获取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目录下

java如何获取项目中的resource路径 获取项目resources路径_maven

(二)URL

注意:getResource("")返回的对象类型是URL不是URI

//调用.getResource("")后可以获取到URL对象。这个对象里面有许多方法,不仅仅能获取目录,还能获取File、URI等对象
URL resource = BrokerConfig.class.getClassLoader().getResource("");

可调用的方法如下:

java如何获取项目中的resource路径 获取项目resources路径_jar_02

(三)获取resources目录下指定文件

当然【getResource()】也可以携带文件目录参数:

我们也可以直接获取到具体文件的路径

java如何获取项目中的resource路径 获取项目resources路径_java_03

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异常。

java如何获取项目中的resource路径 获取项目resources路径_java_04


我们查看jar里面的资源目录:

java如何获取项目中的resource路径 获取项目resources路径_resources_05


我们通过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"));
    }

java如何获取项目中的resource路径 获取项目resources路径_maven_06


输出:

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/

这个目录也就是

java如何获取项目中的resource路径 获取项目resources路径_resources_07

四、对应关系

在运行环境下,我们更多会操作classs文件下的资源。比如jar包,打包好后,如果通过getResourceAsStream(String path)定位资源,那么不管你将jar发到哪个目录下运行都是可行的。【也就是会动态获取路径

java如何获取项目中的resource路径 获取项目resources路径_java_08