Java如何从资源目录加载文件?

在以下代码片段中,我们将学习如何从资源目录或文件夹加载文件。资源文件可以采用图像,音频,文本等形式。例如,文本资源文件可用于存储应用程序配置,例如数据库配置。

要加载此资源文件,您可以使用两种java.lang.Class方法或java.lang.ClassLoader多种方法。双方Class并ClassLoader提供getResource()和getResourceAsStream()方法来加载资源文件。第一种方法返回一个URL对象,而第二种方法返回InputStream。

使用该Class方法时,如果以“ /”开头的资源名称表示它是绝对名称。绝对名称表示它将从指定的目录名称或程序包名称加载。如果不是以“ /”开头,则将其标识为相对名称。这意味着它将与尝试加载资源的类位于同一包中。

App.class.getResource("database.conf");

该代码段将尝试从与App该类相同的包中加载资源文件。如果是App类包,org.nhooo则database.conf文件必须位于/org/nhooo/。这是相对资源名称。

App.class.getResource("/org/nhooo/conf/database.conf"):

该代码段将尝试从给定的包名称中加载资源文件。您应该将配置文件放在下面,/org/nhooo/conf/以使应用程序能够加载它。这是绝对资源名称。下面是使用该Class方法加载资源的代码段。

private void loadUsingClassMethod() throws IOException {
    System.out.println("LoadResourceFile.loadUsingClassMethod");
    Properties properties = new Properties();

    // 相对于LoadResourceFile包加载资源。
    // 这实际上是从 
    // "/org/nhooo/example/lang/database.conf".
    URL resource = getClass().getResource("database.conf");
    properties.load(new FileReader(new File(resource.getFile())));
    System.out.println("JDBC Driver: " + properties.get("jdbc.driver"));

    InputStream is = getClass().getResourceAsStream("/database.conf");
    properties.load(is);
    System.out.println("JDBC Driver: " + properties.get("jdbc.driver"));
}

使用该ClassLoader方法时,资源名称不应以“ /”开头。此方法不会像该Class方法一样对资源名称应用任何绝对/相对转换。这里是使用该ClassLoader方法的方法片段。

private void loadUsingClassLoaderMethod() throws IOException {
    System.out.println("LoadResourceFile.loadUsingClassLoaderMethod");
    Properties properties = new Properties();

    ClassLoader classLoader = getClass().getClassLoader();
    URL resource = classLoader.getResource("database.conf");
    properties.load(new FileReader(new File(resource.getFile())));
    System.out.println("JDBC URL: " + properties.get("jdbc.url"));

    InputStream is = classLoader.getResourceAsStream("database.conf");
    properties.load(is);
    System.out.println("JDBC URL: " + properties.get("jdbc.url"));
}

下面是调用上述方法的主程序。

package org.nhooo.example.lang;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

public class LoadResourceFile {
    public static void main(String[] args) throws Exception {
        LoadResourceFile demo = new LoadResourceFile();
        demo.loadUsingClassMethod();
        demo.loadUsingClassLoaderMethod();
    }
}

在上面的代码段中,我们加载了两个不同的资源。一个包含Oracle数据库配置,另一个包含MySQL数据库配置。

/resources/org/nhooo/example/lang/database.conf

jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.username=nhooo
jdbc.password=nhooo123

/resources/database.conf

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/nhooo
jdbc.username=nhooo
jdbc.password=nhooo123

此代码段的结果是:

LoadResourceFile.loadUsingClassMethod
JDBC Driver: oracle.jdbc.driver.OracleDriver
JDBC Driver: com.mysql.jdbc.Driver

LoadResourceFile.loadUsingClassLoaderMethod
JDBC URL: jdbc:mysql://localhost/nhooo
JDBC URL: jdbc:mysql://localhost/nhooo