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); }