1.一般使用Maven創建Java工程,代碼文件在src/main/java文件夾中,資源文件在src/main/resources文件夾中,Java代碼為什么可以讀取到src/main/resources下的資源文件呢?
=> Maven會將Java工程編譯到target文件夾下,/target/classes應該就是其根目錄。編譯后發現,.class文件就在這個文件夾下的對應子文件夾中,而src/main/resources下的文件被復制到了這個文件夾下。
2. src/test/java目錄下的測試代碼,又是如何讀取resources的呢?
=> Maven會將src/test/java文件夾下的代碼編譯到target/test-classes文件夾下。同樣的,如果src/test/resources下有資源文件的話,就復制到target/test-classes文件夾下。
測試代碼運行時,優先使用test-classes文件夾下的資源文件,如果不存在,再使用classes文件夾下的資源文件。
public void loadProperties1() throws IOException {
InputStream input = null;
// read from the root folder
input = this.getClass().getResourceAsStream("/config.properties");
// InputStream java.lang.Class.getResourceAsStream(String name)
// 1.首先,根據資源名稱構造出一個絕對的資源路徑
// 如果資源名稱以'/'開頭,資源的絕對名稱就是'/'之后的名稱部分
// 否則,就是modified_package_name/name
// modified_package_name就是這個類的包名,其中的'.'換為'/'
// 2.然后,查找資源的規則是由類的class loader實現的。
// 如果這個類是由bootstrap類加載器加載的話,就會用ClassLoader.getSystemResourceAsStream.
printProperties(input);
}
public void loadProperties2() throws IOException {
InputStream input = null;
input = this.getClass().getClassLoader().getResourceAsStream("config2.properties");
// URL java.lang.ClassLoader.getResource(String name)
// 資源名就是由'/'分割的資源的路徑名
// 首先查找父類加載器
// 如果父是null,就查找內置到VM中的該類加載器的路徑
// 失敗的話,調用 findResource(String)
printProperties(input);
}
