1. 程式人生 > >獲取專案中檔案路徑

獲取專案中檔案路徑

獲取專案中檔案路徑


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 環境下使用