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