獲取專案中檔案路徑
阿新 • • 發佈:2018-11-25
獲取專案中檔案路徑
Class.getResource 與 ClassLoader.getResource
- 區別
方式 | 入參 | 返回 |
---|---|---|
Class.getResource() | 檔案路徑引數,絕對路徑或相對路徑(相對於該class類) | URL |
ClassLoader.getSystemResource() | 檔案路徑引數,相對路徑(相對於專案的包的根目錄來解析路徑的) | URL |
- 聯絡
// Class.getResource 底層實現實質是呼叫 ClassLoader.getResource 方法 public java.net.URL getResource(String name) { name = resolveName(name); ClassLoader cl = getClassLoader0(); if (cl==null) { // A system class. return ClassLoader.getSystemResource(name); } return cl.getResource(name); } /** * Add a package name prefix if the name is not absolute Remove leading "/" * if name is absolute */ private String resolveName(String name) { if (name == null) { return name; } if (!name.startsWith("/")) { Class c = this; while (c.isArray()) { c = c.getComponentType(); } String baseName = c.getName(); int index = baseName.lastIndexOf('.'); if (index != -1) { // 將檔案路徑資訊中的.替換為/ // 即將com.study改為com/study name = baseName.substring(0, index).replace('.', '/') +"/"+name; } } else { // 如果是以/開頭,將絕對路徑改為相對路徑 name = name.substring(1); } // ClassLoader 解析檔案的相對路徑 return name; }
- 示例
-
準備
-
程式碼
-
// Eclipse // JDK 1.6 package com.study.test; import java.net.URL; /** * 讀取檔案 */ public class ResourceMain { /** * 同一包內的檔案 */ public static final String PACKAGE_INNER_FILE = "packageInner.xml"; /** * 不同包內的檔案 */ public static final String PACKAGE_OUTTER_FILE = "packageOuter.xml" ; /** * src/main/java 根目錄下的檔案 */ public static final String ROOT_FILE = "rootFile.xml" ; /** * src/main/resource 根目錄下的檔案 */ public static final String ROOT_RESOURCE_FILE = "rootResourceFile.xml"; /** * @param args */ public static void main(String[] args) { classGetResource(); classLoaderGetResource(); } /** * 通過 Class.getResource() 查詢檔案 * 入參:表示檔案路徑的引數 * 相對路徑:相對於該class類 * 絕對路徑:根目錄符號/是代表專案路徑而不是磁碟的根目錄 * 返回:URL */ private static void classGetResource(){ URL packageInnerFilePath = ResourceMain.class.getResource(PACKAGE_INNER_FILE); System.out.println("classGetResource packageInnerFilePath:"+packageInnerFilePath.getPath()); // 輸出:classGetResource packageInnerFilePath:/D:/work/space/workspace/test/target/classes/com/study/test/packageInner.xml /** * 說明: * 1.引數為 PACKAGE_OUTTER_FILE,未找到檔案 * 2.相對於 ResourceMain.java 的上一層 * 儲存時 resource 與 test 都在 com/study/resource 目錄下 * 3.引數../ 退回到上一層目錄 */ URL packageOutterFilePath = ResourceMain.class.getResource("../resource/"+PACKAGE_OUTTER_FILE); System.out.println("classGetResource packageOutterFilePath:"+packageOutterFilePath.getPath()); // 輸出:classGetResource packageOutterFilePath:/D:/work/space/workspace/test/target/classes/com/study/resource/packageOuter.xml /** * 1.相對於 ResourceMain.java 向上三層 * com 一層 * study 一層 * test 一層 */ URL rootFilePath = ResourceMain.class.getResource("../../../"+ROOT_FILE); System.out.println("classGetResource rootFilePath:"+rootFilePath.getPath()); // 輸出:classGetResource rootFilePath:/D:/work/space/workspace/test/target/classes/rootFile.xml /** * 1.src/main/resource 與 src/main/java 均為源包 * 編譯檔案均放在../target/classes目錄下 */ URL rootResourceFilePath = ResourceMain.class.getResource("../../../"+ROOT_RESOURCE_FILE); System.out.println("classGetResource rootResourceFilePath:"+rootResourceFilePath.getPath()); // 輸出:classGetResource rootResourceFilePath:/D:/work/space/workspace/test/target/classes/rootResourceFile.xml } /** * 通過 ClassLoader.getResource() 查詢檔案 * 入參:表示檔案路徑的引數的相對路徑 * 相對路徑:相對於專案的包的根目錄來解析路徑的 * 返回:URL */ private static void classLoaderGetResource(){ /** * 1.相對於包的根目錄 */ URL packageInnerFilePath = ClassLoader.getSystemResource("com/study/test/"+PACKAGE_INNER_FILE); System.out.println("classLoaderGetResource packageInnerFilePath:"+packageInnerFilePath.getPath()); // 輸出:classLoaderGetResource packageInnerFilePath:/D:/work/space/workspace/test/target/classes/com/study/test/packageInner.xml /** * 1.相對於包的根目錄 */ URL packageOutterFilePath = ClassLoader.getSystemResource("com/study/resource/"+PACKAGE_OUTTER_FILE); System.out.println("classLoaderGetResource packageOutterFilePath:"+packageOutterFilePath.getPath()); // 輸出:classLoaderGetResource packageOutterFilePath:/D:/work/space/workspace/test/target/classes/com/study/resource/packageOuter.xml /** * 1.檔案在包的根目錄下 */ URL rootFilePath = ClassLoader.getSystemResource(ROOT_FILE); System.out.println("classLoaderGetResource rootFilePath:"+rootFilePath.getPath()); // 輸出:classLoaderGetResource rootFilePath:/D:/work/space/workspace/test/target/classes/rootFile.xml /** * 1.檔案在包的根目錄下 */ URL rootResourceFilePath = ClassLoader.getSystemResource(ROOT_RESOURCE_FILE); System.out.println("classLoaderGetResource rootResourceFilePath:"+rootResourceFilePath.getPath()); // 輸出:classLoaderGetResource rootResourceFilePath:/D:/work/space/workspace/test/target/classes/rootResourceFile.xml } /** * 獲取專案路徑 * 1.ResourceMain.class.getResource("/") = ClassLoader.getSystemResource("") */ private static void getPath(){ /** * 專案根目錄 */ String relativePath = System.getProperty("user.dir"); System.out.println("relativePath:"+relativePath); // 輸出:relativePath:D:\work\space\workspace\test URL classGetResourceRelativePash = ResourceMain.class.getResource(""); System.out.println("classGetResourceRelativePash:"+classGetResourceRelativePash.getPath()); // 輸出:classGetResourceRelativePash:/D:/work/space/workspace/test/target/classes/com/study/test/ URL classGetResourceAbsolutePash = ResourceMain.class.getResource("/"); System.out.println("classGetResourceAbsolutePash:"+classGetResourceAbsolutePash.getPath()); // 輸出:classGetResourceAbsolutePash:/D:/work/space/workspace/test/target/classes/ URL classLoaderGetResourceAbsolutePath = ClassLoader.getSystemResource(""); System.out.println("classLoaderGetResourceAbsolutePath:"+classLoaderGetResourceAbsolutePath.getPath()); // 輸出:classLoaderGetResourceAbsolutePath:/D:/work/space/workspace/test/target/classes/ } }
org.apache.ibatis.io.Resources
- 相對於專案的包的根目錄來解析路徑的載入檔案
- 常用方法
方法 | 用途 |
---|---|
Reader getResourceAsReader(String resource) | 簡單的只讀文字資料 |
Stream getResourceAsStream(String resource) | 簡單的只讀二進位制或文字資料 |
File getResourceAsFile(String resource) | 可讀寫的二進位制或文字檔案 |
Properties getResourceAsProperties(String resource) | 只讀的配置屬性檔案 |
Url getResourceAsUrl(String resource) | 只讀的通用資源 |
- 示例
-
準備
-
程式碼
-
package com.mybatis.study.util;
import java.io.IOException;
import java.net.URL;
import org.apache.ibatis.io.Resources;
public class ResourceMain {
/**
* Exception in thread "main" java.io.IOException: Could not find resource com/mybatis/study/mapperpackageOutter.xml
* 解決方法
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/**
* 預設載入專案 target/classes/ 檔案
*/
URL resourceUrl = Resources.getResourceURL("");
System.out.println("resourceUrl:"+resourceUrl.getPath());
// 輸出:resourceUrl:/D:/work/space/workspace/mybatis/target/classes/
/**
* src/main/resource 為源包,MyBastis_config.xml 放在 target/classes
*/
URL myBatisConfigUrl = Resources.getResourceURL("MyBatis_config.xml");
System.out.println("myBatisConfigUrl:"+myBatisConfigUrl.getPath());
// 輸出:myBatisConfigUrl:/D:/work/space/workspace/mybatis/target/classes/MyBatis_config.xml
URL packageInnerUrl = Resources.getResourceURL("com/mybatis/study/util/"+"packageInner.xml");
System.out.println("packageInnerUrl:"+packageInnerUrl.getPath());
// 輸出:packageInnerUrl:/D:/work/space/workspace/mybatis/target/classes/com/mybatis/study/util/packageInner.xml
URL packagetOutterUrl = Resources.getResourceURL("com/mybatis/study/mapper/"+"packageOutter.xml");
System.out.println("packagetOutterUrl:"+packagetOutterUrl.getPath());
// 輸出:packagetOutterUrl:/D:/work/space/workspace/mybatis/target/classes/com/mybatis/study/mapper/packageOutter.xml
}
}
WEB專案根目錄獲取
不同系統獲取相對路徑不同
- Windows 環境下獲取的相對路徑不能在 Linux 環境下使用