2009年11月30日
摘要: 本文是基于最新的SUN官方文檔Java SE 6 Hotspot VM Options 編寫的譯文。主要介紹JVM中的非穩態選項及其使用說明。
為了讓讀者明白每個選項的含義,作者在原文基礎上補充了大量的資料。
因為是初稿,如有描述錯誤,敬請指正。
非穩態選項使用說明
-XX:+<option> 啟用option
-XX:-<optio...
閱讀全文
2009年11月27日
在開發java程序的過程中,我們經常要做的一件事就是獲取資源。那么什么是資源呢?說白了,在計算機里那就是一堆數據。只是這堆數據對我們的java程序有多種表現形式,一般來說有File,URL,InputStream等等。而單就文件這一項就有很多種:配置文件,java類文件,jps文件,圖片、css、js文件等等。面對這林林總總的資源,我們在設計一個讀取資源的接口時,就需要針對不同形式的資源提供方法,這樣就導致我們的接口還是與實際的資源形式綁定在一起,未能完全的抽象。另外,在java程序中資源的存放位置也是各異的。有的存放在classpath中,有的存放在文件系統中,有的存放在web應用中。而對于不同位置的資源,java程序獲取這些資源的方法各有不同。
A、獲取classpath中的資源:
Java代碼
URL url = this.getClass().getResource("resource_name");
URL url = this.getClass().getClassLoader().getResource("resource_name");
URL url = Thread.currentThread().getContextClassLoader().getResource("resource_name");
甜性澀愛下載 http://www.bt285.cn/content.php?id=1196863
那么在jdk中為什么又提供了三種方式來獲取classpath下的資源呢?這其中是有些來頭的。
第一行代碼中是利用Class類的實例來獲取,第二行代碼是使用加載當前類的classloader來獲取。看下jdk中的源代碼會發現class類的實例最后還是委托加載他的classloader來獲取資源的。
Java代碼
/**
* 色即是空2下載 http://www.bt285.cn/sejishikong/
愛的色放下載 http://www.bt285.cn/aidesefang/
*/
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);
}
從上面的代碼中可以看出,對于資源的加載并沒有像類加載所采用的雙親委托機制。而是當前類的classloader不為null的情況下先從當前類的classloader中加載資源。而只有當前類的classloader為null的時候才從system classloader中去加載資源。這樣可以方便我們自定義配置類覆蓋一些默認配置。當然,j2se應用中如果沒有特別定制classloader時,我們自己寫的類都是被system classloader加載的。到底利用class去獲取資源和利用classloader去獲取資源有什么區別呢?區別就在 resolveName(name)這個方法中。兩種方式對于資源名稱的表示方式不同。下面是一個簡單的包結構,/表示類路徑的根
/
|-com.cn.test
|-Test.class
|-test2.txt
|-test1.txt
Java代碼
// 獲取與當前類在同一個包下的資源
URL url1 = this.getClass().getResource("test2.txt");
// 獲取com.cn.test包下的資源,需加/
URL url2 = this.getClass().getResource("/com/cn/test/test2.txt");
// 獲取類路徑根下的資源
URL url3 = this.getClass().getClassLoader().getResource("test1.txt");
// 獲取包com.cn.test包下的資源
URL url4 = this.getClass().getResource("com/cn/test/test2.txt");
而第三利用當前線程的contextClassLoader來獲取資源的解釋可以參考我的另一篇
B、獲取文件系統中的資源
Java代碼
// 1、獲得File對象
File file = new File("test.txt");
// 2、獲得File對象的字節流
InputStream in = new FileInputStream(file);
值得注意的是在File的構造函數File(String name) 中的name參數可以是相對路徑和絕對路徑。相對路徑是相對于System.getProperties("user.dir")的。
C、獲取web應用中的資源
Java代碼
servletContext.getResourceAsStream(resource_name);
resource_names為相對于webroot的路徑表示。例如獲取web.xml,resource_name表示為"/WEB-INF/web.xml"
面對上面介紹的各種資源表現形式和存放位置,難道java中就沒有提供一個統一處理方式嗎?有,java.net.URL。
從名稱上來看 URL(Uniform Resource Locator) 統一資源定位器。看起來很好很強大。但很多時候使用它并不能定位到我們需要的資源。
首先,它jdk中體統的URL能訪問的協議非常有限(當然可以進行擴展,不過很麻煩);常用的有http,file,ftp等等。并沒有提供對classpath和servletContext中的資源的獲取方法。
另外,它沒有提供判斷資源是否存在的方法。每次只有等我們真正去獲取資源的時候拋出異常才能知道資源無法獲取。
其次,URL這個類的職責未劃分清楚,既用來表示資源有用來獲取其資源。