在Java中獲取系統屬性(轉)
?Java語言以其面向對象、跨平臺、可移植性好、安全性高等優點,受到眾多編程人員的青睞,越來越多的人將其作為應用軟件開發語言的首選。?在Java應用程序運行時,特別是需要在跨平臺工作環境下運行時,需要確定操作系統類型、用戶JDK版本和用戶工作目錄等隨工作平臺變化的信息,來保證程序正確運行。一般情況下,可以利用JDK提供的系統屬性類(Properties)中的方法,快速地獲取工作環境信息。另外,程序開發人員還可以定義與應用程序相關的系統屬性文件,在用戶程序執行過程中動態地加載程序員定義的屬性文件來控制程序運行。?
本文通過對系統屬性類的分析,結合實際例子介紹如何定義系統屬性文件,并討論安全策略文件的定義。?
屬性類?Java?Properties類的繼承關系如下:?
java.lang.Object?
+--java.util.Dictionary?
+--java.util.Hashtable?
+--java.util.Properties?
在應用程序開始執行時,程序首先讀取系統的默認屬性。如果定義了用戶屬性文件,則應用程序加載該屬性文件。程序運行過程中可以根據執行情況動態地修改屬性定義,并在程序結束運行前,保存屬性文件。?
獲取屬性的方法:?
●contains(Object?value)、containsKey(Object?key):如果給定的參數或屬性關鍵字在屬性表中有定義,該方法返回True,否則返回False;?
●getProperty(String?key)、getProperty(String?key,?String?default):根據給定的屬性關鍵字獲取關鍵字值;?
●list(PrintStream?s)、list(PrintWriter?w):?在輸出流中輸出屬性表內容;?
●size():返回當前屬性表中定義的屬性關鍵字個數。?
設置屬性的方法:?
●put(Object?key,?Object?value)?:向屬性表中追加屬性關鍵字和關鍵字的值;?
●remove(Object?key)?:從屬性表中刪除關鍵字。?
獲取系統屬性?
系統屬性是指與用戶程序相關的操作系統配置信息以及軟件信息。通常與用戶程序相關的屬性關鍵字包括:?
●file.separator?:?文件分隔符,?Windows環境下為“",Unix環境下為“/”;?
●user.home?:用戶主目錄;?
●java.home?:Java實時運行環境的安裝目錄;?
●java.ext.dirs?:JDK的安裝目錄;?
●os.name?:操作系統名稱;?
●user.name?:用戶登錄名稱;?
●os.version?:操作系統版本;?
●path.separator?:當前操作系統的路徑分隔符;?
●user.dir?:當前用戶程序所在目錄。?
下面結合例子說明獲取系統屬性的方法。?
/*getSystemProperties.java*/?
import?java.util.Properties;??
public?class?getSystemProperties?
{?
public?static?void?main(String?args[])?
{??
//通過獲得系統屬性構造屬性類?prop?
Properties?prop?=?new?Properties(??
System.getProperties()?);?
//在標準輸出中輸出系統屬性的內容?
prop.list(System.out);?
}?
//根據獲取的系統屬性確定程序執行流程?
……?
}?
上述程序執行后,在Windows環境中產生類似如下的輸出:?
user.home=C:WIN95?
java.home=D:JDK1.2JRE?
java.ext.dirs=D:JDK1.2?
os.name=Windows?95?
user.name=Office?
java.vm.name=Classic?VM?
os.version=4.10?
path.separator=;?
file.separator=?
user.dir=D:JavaTest?
屬性文件的操作方法?
Java程序開發人員可以通過定義屬性文件來設置程序運行的參數。屬性文件是程序外部文件,在應用程序初始運行時,可以通過讀取屬性文件來獲取有關程序運行的參數。例如,在程序運行時需要在程序外部控制程序的執行流程,這時可以通過定義屬性文件的方法達到目的。下面結合例子說明屬性文件的操作方法:?
/*PropertyFile.java*/?
//引入相關類?
import?java.io.*;?
import?java.util.Properties;?
public?class?PropertyFile?
{?
//定義文件輸入和輸出流?
static?FileInputStream?fis;?
static?FileOutputStream?fos;?
public?static?void?main(String?args[])?
{??
//生成新的屬性對象?
Properties?prop?=?new?Properties();?
try?
{??
//生成文件輸入和輸出流,輸入流指向用戶已經定義的屬性文件,輸出流指向由應用程序新定義的屬性文件?
fis?=?new?FileInputStream?
(“firstProp.txt”);?
fos?=?new?FileOutputStream?
(“secondProp.txt”);?
}?
catch(FileNotFoundException?e)?
{?
System.out.println(“Cannot?create?the?file?stream”);?
}?
try?
{?
//從輸入文件加載系統屬性?
prop.load(fis);?
//根據程序執行情況更改屬性關鍵字的值?
prop.put(“Switch”,“1”);?
//輸出新屬性文件secondProp.txt?
prop?.save?(?fos?,“--?a?new?properties?file-”);?
}?
catch(IOException?e)?
{?
System.out.println(“Exception?in?repleace?the?keyword”);?
}?
}?
}?
在程序執行之前,用戶必須首先定義屬性文件firstProp.txt,該文件內容如下:?
Switch=?0?
Version=?1.0?
Directory=?JavaTest?
程序運行后,輸出新的屬性文件secondProp.txt,該文件內容如下(注意觀察兩個文件關鍵字Switch內容的區別):?
#--a?new?properties?file--?
#Sun?Mar?11?21:22:40?CST?2001?
Switch=?1?
Version=?1.0?
Directory=?JavaTest?
從上例可以看出,通過JDK提供的屬性類Properties可以方便地在程序外部對應用程序的執行流程進行控制,從而簡化了編程難度,使程序流程可控性更好。?
安全策略文件?
Java提供的應用程序環境的安全策略,使得不同的代碼對系統資源擁有不同的訪問許可。Java應用程序安全策略由Policy對象來表達,通過定義安全策略文件來實現。Java?1.2的安全策略文件分為三級:系統安全策略文件、用戶安全策略文件和缺省安全策略文件。當Java應用程序啟動后,按照先后順序加載安全策略內容。下面結合典型的安全策略文件內容對安全策略文件的定義進行說明:?
grant?
{??
//對系統和用戶目錄設置“讀”的權限?
permission?java.util.PropertyPermission?“user.dir”,?
“read”;?
permission?java.util.PropertyPermission?“user.home”,“read”;?
permission?java.util.PropertyPermission?“java.home”,“read”;?
permission?java.util.PropertyPermission?“java.class.?
path”,“read”;?
permission?java.util.PropertyPermission?“user.name”,“read”;?
//其他安全策略內容?
};?
上述安全策略文件定義了應用程序對用戶目錄、用戶登錄目錄、JDK安裝目錄、用戶名稱等系統內容具有讀的權限。
posted on 2006-06-16 14:47 liaojiyong 閱讀(190) 評論(0) 編輯 收藏 所屬分類: Java