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