天天看點

Java擷取類路徑方法

參考原文:

  1. CSDN| Java擷取類路徑的方式:

    https://blog.csdn.net/An1090239782/article/details/82590011

  2. Java如何擷取目前的jar包路徑以及如何讀取jar包中的資源:https://www.cnblogs.com/zeciiii/p/4178824.html

擷取項目路徑、類加載路徑、目前類路徑,和在jar包中運作的結果對比

public void printPath() throws IOException {
		/*
		 * 擷取項目路徑
		 */
		System.out.println("**擷取項目路徑**");
		System.out.print("\t1.利用File類提供的方法 擷取項目路徑-----\n\t");
		//1. (利用File類提供的方法 擷取項目路徑)
		File directory = new File("");// 參數為空
		String courseFile = directory.getCanonicalPath();
		System.out.println(courseFile);
		
		System.out.print("\t2.System.getProperty()函數擷取項目路徑-----\n\t");
		//2. (System.getProperty()函數擷取項目路徑)
		String property = System.getProperty("user.dir");
		System.out.println(property);
		
		
		/*
		 * 擷取類加載根路徑(classes目錄)
		 */
		System.out.println("**擷取類加載根路徑classes**");
		System.out.print("\t3.使用getClass().getResource(\"/\")方法-----\n\t");
		//3. (使用getClass().getResource("/")方法)
		URL path_1 = this.getClass().getResource("/");//傳回URL的對象,路徑前方以file:開頭,并且以"/"做目錄間隔
		System.out.println(path_1);//  file:/D:/work/workspace_set/workspace_javaee/ProjectJavaWay/target/classes/
		System.out.print("\t");
		String path_2 = this.getClass().getResource("/").getPath();//傳回路徑最前方和末尾均多一個"/",并且以"/"做目錄間隔
		System.out.println(path_2);//  /D:/work/workspace_set/workspace_javaee/ProjectJavaWay/target/classes/
		System.out.print("\t");
		String path_3 = this.getClass().getResource("/").getFile();//.getFile()和.getPath()作用相同
		System.out.println(path_3);//  /D:/work/workspace_set/workspace_javaee/ProjectJavaWay/target/classes/
		System.out.print("\t");
		File file = new File(path_2);//用File對象處理後,會删除頭尾的"/",并且将所有的以"\(反斜杠)"間隔目錄
		System.out.println(file);//  D:\work\workspace_set\workspace_javaee\ProjectJavaWay\target\classes

		System.out.print("\t4.使用getClass().getClassLoader()方法-----\n\t");
		//4. (使用getClass().getClassLoader()方法)
		String classsesPath_1 = this.getClass().getClassLoader().getResource("").getPath();
		System.out.println(classsesPath_1);

		System.out.print("\t5.使用getClass().getProtectionDomain().getCodeSource()方法-----\n\t");
		//5. (使用getClass().getProtectionDomain().getCodeSource()方法)
		String classsesPath_2 = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
		System.out.println(classsesPath_2);
		
		
		/*
		 * 擷取目前類所在目錄
		 */
		System.out.println("**6.擷取目前類所在目錄**");
		String classPath = this.getClass().getResource("").getPath();
		System.out.println(classPath);
		

		// 第五種:  擷取所有的類路徑 包括jar包的路徑(...\classes和...\**.jar)
		System.out.println("**7.擷取所有的類路徑 包括jar包的路徑(...\\classes和...\\**.jar)**");
		System.out.println(System.getProperty("java.class.path"));
	}
	
           

eclipse中執行獲得輸出内容如下:

Java擷取類路徑方法

将這個類打成jar包,運作結果如下:

Java擷取類路徑方法

發現出現問題,在jar包中時,

URL path_1 = this.getClass().getResource("/");

this.getClass().getClassLoader().getResource("");

,這兩種方式擷取到的值為null,是以導緻後續出現空指針異常。

經過測試,發現隻有1、2、5、7方式能夠使用:

Java擷取類路徑方法