工具類
package cn.xydata.util;
import java.io.InputStream;
import java.util.Properties;
public class PropertiesUtil {
/**
* 根據key獲取value
* @param key
* @return
*/
public static String getValue(String key){
try {
InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream("config.properties");//讀取xml部分
Properties properties = new Properties();
properties.load(in);
String value = properties.getProperty(key)==null?"":properties.getProperty(key).toString();
return value;
} catch (Exception e) {
return "";
}
}
}
------------------------------------------------------------------------------------------------------------------------------------------------
測試代碼
String logoPathDir = PropertiesUtil.getValue("personImageURL");
------------------------------------------------------------------------------------------------------------------------------
config.properties配置文件
uploadResultFileDirs= e://
uploadFileDirs=e://
QRPath=e://
BoxPath=E://BoxQR//
photoURL=G://ots//img//photo//
fileURL=d://ots//file//
defaultPassword = 111111
personImageURL = G://ots//img//person//
personDownloadImageURL = G://ots//img//downloadperson//
apiURL=http://localhost:8080/
----------------------------------------------------------------------------------------------------------------------
Class.getResource和ClassLoader.getResource的區別分析
在Java中獲取資源的時候,經常用到Class.getResource和ClassLoader.getResource,本文給大家說一下這兩者方法在獲取資源文件的路徑差異。
Class.getResource(String path)
path不以'/'開頭時,默認是從此類所在的包下取資源;path以'/'開頭時,則是從項目的ClassPath根下獲取資源。在這里'/'表示ClassPath
JDK設置這樣的規則,是很好理解的,path不以'/'開頭時,我們就能獲取與當前類所在的路徑相同的資源文件,而以'/'開頭時可以獲取ClassPath根下任意路徑的資源。
如下所示的例子:
1
2
3
4
5
6
7
8
|
public class Test
{
public static void main(String[] args)
{
System.out.println(Test.class.getResource(""));
System.out.println(Test.class.getResource("/"));
}
}
|
運行結果為:
file:/D:/work_space/java/bin/net/swiftlet/
file:/D:/work_space/java/bin/
Class.getClassLoader().getResource(String path)
path不能以'/'開頭時,path是指類加載器的加載范圍,在資源加載的過程中,使用的逐級向上委托的形式加載的,'/'表示Boot ClassLoader中的加載范圍,因為這個類加載器是C++實現的,所以加載范圍為null。如下所示:
1
2
3
4
5
6
7
8
|
public class Test
{
public static void main(String[] args)
{
System.out.println(Test.class.getClassLoader().getResource(""));
System.out.println(Test.class.getClassLoader().getResource("/"));
}
}
|
運行結果為:
file:/D:/work_space/java/bin/
null
從上面可以看出:
class.getResource("/") == class.getClassLoader().getResource("")
其實,Class.getResource和ClassLoader.getResource本質上是一樣的,都是使用ClassLoader.getResource加載資源的。下面請看一下jdk的Class源碼:
1
2
3
4
5
6
7
8
9
10
11
|
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);
}
|
從上面就可以看才出來:Class.getResource和ClassLoader.getResource本質上是一樣的。至於為什么Class.getResource(String path)中path可以'/'開頭,是因為在name = resolveName(name);進行了處理:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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)
{
name = baseName.substring(0, index).replace('.', '/')
+"/"+name;
}
} else
{//如果是以"/"開頭,則去掉
name = name.substring(1);
}
return name;
}
|
聲明: 本文由金絲燕網原創編譯,轉載請保留鏈接: Class.getResource和ClassLoader.getResource的區別分析,更多交流請加群:278721352