在Java程序中加載外部文件有多中方式,每種方式也存在區別,本文將理清這些加載方式之間的區別。java
package org.xialei.example.resource; import java.io.File; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { File file = new File("app.properties"); System.out.println(file.getAbsolutePath()); } }
常見的讀取方式,使用該方式讀取文件時規則以下:segmentfault
若是傳入的是絕對路徑,則以系統根目錄做爲絕對路徑的起點。若是傳入的是相對路徑,則以當前工做目錄做爲起點。app
本例中,運行java
命令的目錄即爲工做目錄,app.properties從工做目錄開始查找。spa
package org.xialei.example.resource; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class Main { public static void main(String[] args) throws IOException { try (InputStream is = Main.class.getResourceAsStream("app.properties")) { Properties properties = new Properties(); properties.load(is); System.out.println(properties.getProperty("name")); } } }
使用該方式讀取文件時規則以下:code
若是傳入的是相對路徑,則以當前class所在的包做爲起點。若是傳入的是絕對路徑,則以classpath的根目錄爲起點。get
Main.class.getResourceAsStream("app.properties")
會讀取/org/xialei/example/resource/app.properties
文件。Main.class.getResourceAsStream("/app.properties")
會讀取"classpath:/app.properties"文件package org.xialei.example.resource; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class Main { public static void main(String[] args) throws IOException { try (InputStream is = Main.class.getClassLoader().getResourceAsStream("org/xialei/example/resource/app.properties")) { Properties properties = new Properties(); properties.load(is); System.out.println(properties.getProperty("name")); } } }
使用該方式時規則以下:it
使用classpath根目錄做爲起點。
本例中,org/xialei/example/resource/app.properties
就是從classpath根目錄進行查找的。io