Java加载类路径下资源

一、Java加载类路径下资源

Java加载类路径下资源有两种方式:类对象实例的相关方法和类加载器实例的相关方法。例子如下:

//类对象实例的相关方法
Main.class.getResource("a.txt");
Main.class.getResource("/a.txt");

//类加载器实例的相关方法
Main.class.getClassLoader().getResource("a.txt");

类对象实例的方式最后是通过类加载器实例的方式来加载类路径下资源的,因而我们接下来只讨论类加载器实例的方式。

二、类加载器实例方式加载类路径下资源

根据“类加载器”的介绍,可知有3种类加载器:引导类加载器,扩展类加载器,系统类加载器。我们这里所说的“类路径”是指可通过“-classpath”选项进行设置的类路径,因而我们谈论的类加载器也只是系统类加载器。
在一个Java应用程序运行的过程中,一般会存在多个类加载器实例。比如在如下代码中:

package com.dslztx.java;

public class MyClass {
    public static void main(String[] args) {
        System.out.println(MyClass.class.getClassLoader());
        System.out.println(ClassLoader.getSystemClassLoader());
    }
}

自定义应用类“MyClass”是由系统类加载器加载的,因而MyClass.class.getClassLoader()得到的是一个系统类加载器类实例;ClassLoader.getSystemClassLoader()得到的也是一个系统类加载器类实例。
一般我们统一选用ClassLoader.getSystemClassLoader()的方式即可。

三、举例说明

现在有一个Java项目,目录结构如图1所示。项目下有一个“Main.java”文件,内容如下所示:

package com.dslztx.java;

public class Main {
    public static void main(String[] args) {
        ClassLoader c1 = Main.class.getClassLoader();
        ClassLoader c2 = ClassLoader.getSystemClassLoader();

        System.out.println("Using Main.class.getClassLoader()");
        System.out
                .println("file a finding the address is" + c1.getResource("a") == null ? "null" : c1.getResource("a"));
        System.out
                .println("file b finding the address is" + c1.getResource("b") == null ? "null" : c1.getResource("b"));
        System.out
                .println("file c finding the address is" + c1.getResource("c") == null ? "null" : c1.getResource("c"));

        System.out.println("Using ClassLoader.getSystemClassLoader()");
        System.out
                .println("file a finding the address is" + c2.getResource("a") == null ? "null" : c2.getResource("a"));
        System.out
                .println("file b finding the address is" + c2.getResource("b") == null ? "null" : c2.getResource("b"));
        System.out
                .println("file c finding the address is" + c2.getResource("c") == null ? "null" : c2.getResource("c"));
    }
}

从“Classpath”目录下执行javac src/com/dslztx/java/Main.java命令,进行编译,此时目录结构如图2所示。

图1
Java加载类路径下资源_第1张图片

图2
Java加载类路径下资源_第2张图片

执行java -classpath "./src:./lib" com.dslztx.java.Main命令,可以发现执行结果如图3所示。只能找到“a”和“b”文件,因为这两个文件的父目录是类路径。

图3
Java加载类路径下资源_第3张图片
执行java -classpath ".:./src:./lib" com.dslztx.java.Main命令,可以发现执行结果如图4所示。能够找到“a”,“b”和“c”这3个文件,因为这3个文件的父目录都是类路径。

图4
Java加载类路径下资源_第4张图片

执行java -classpath "./src" com.dslztx.java.Main命令,可以发现执行结果如图5所示。只能够找到“b”这个文件,因为只有该文件的父目录是类路径。

图5
Java加载类路径下资源_第5张图片

你可能感兴趣的:(语言)