java 获取资源,Java资源获取
Java程序中,通常通過getResource()方法獲取資源,其中有一下方法及其區別
Class.getResource(String path);
/*
path不以"/"開頭時,默認是此包下獲取資源
path在以"/"開頭時,默認是此項目的ClassPath根下獲取資源
*/
package com.test.testResource;
public class Main {
public static void main(String[] args) {
System.out.println(Main.class.getResource("/"));
}
}
/*
輸出為file:/C:/Users/Chywan/OneDrive/daily_program/Java/LearningCode/Test/target/classes/
*/
package com.test.testResource;
public class Main {
public static void main(String[] args) {
System.out.println(Main.class.getResource(""));
}
}
/*
輸出為file:/C:/Users/Chywan/OneDrive/daily_program/Java/LearningCode/Test/target/classes/com/test/testResource/
*/
//所以,其實在沒有加入"/“時獲取的是相對于類的相對路徑為”“所對應的絕對路徑,在使用”/“后獲取的是編譯后的類的路徑,如maven編譯的項目就是target/classes/
Class.getClassloader.getResource();
/*
ClassLoader的加載是雙親委派機制,所以在獲取Main.class.getClassLoader()時獲得的是BootstrapClassLoader,是C++底層實現的,所以getResource("/")獲取的是null,而getResource("")時,獲取的是加載器的相對路徑,我的理解是加載器是從項目的類根路徑起效的,所以就算類根路徑
*/
package com.test.testResource;
public class Main {
public static void main(String[] args) {
System.out.println(Main.class.getClassLoader().getResource("/"));
}
}
/*輸出為null
*/
package com.test.testResource;
public class Main {
public static void main(String[] args) {
System.out.println(Main.class.getClassLoader().getResource(""));
}
}
/*輸出為file:/C:/Users/Chywan/OneDrive/daily_program/Java/LearningCode/Test/target/classes/
*/
// 源碼里面可以看到resolveName()方法對路徑進行處理,本質Class.getResource(String path)還是調用了ClassLoader的方法。
public URL getResource(String name) {
name = resolveName(name);
//獲取資源
}
private String resolveName(String name) {
if (!name.startsWith("/")) { //相對路徑
Class> c = this;
while (c.isArray()) {
c = c.getComponentType();
}
String baseName = c.getPackageName(); //獲取包名
if (baseName != null && !baseName.isEmpty()) { //拼接路徑
name = baseName.replace('.', '/') + "/" + name;
}
} else { //根路徑開始
name = name.substring(1);
}
return name;
}
總結
以上是生活随笔為你收集整理的java 获取资源,Java资源获取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java正三角形程序怎么写,java实现
- 下一篇: Java开发入坑,Java开发的自学路线