java工具配置_Java™ 教程(配置实用工具)
配置實(shí)用工具
本節(jié)介紹一些幫助應(yīng)用程序訪問其啟動(dòng)上下文的配置實(shí)用程序。
屬性
Properties是作為鍵/值對管理的配置值,在每對中,鍵和值都是字符串值,鍵標(biāo)識(shí)并用于檢索值,就像變量名用于檢索變量的值一樣。例如,能夠下載文件的應(yīng)用程序可能使用名為“download.lastDirectory”的屬性來跟蹤上次下載所使用的目錄。
要管理屬性,請創(chuàng)建java.util.Properties的實(shí)例,此類提供以下方法:
將鍵/值對從流中加載到Properties對象中
從其鍵中檢索值
列出鍵及其值
枚舉鍵
將屬性保存到流
有關(guān)流的介紹,請參閱基礎(chǔ)I/O課程中的I/O流部分。
Properties擴(kuò)展了java.util.Hashtable,從Hashtable繼承的一些方法支持以下操作:
測試以查看特定鍵或值是否在Properties對象中
獲取當(dāng)前鍵/值對的數(shù)量
移除鍵及其值
將鍵/值對添加到Properties列表中
枚舉值或鍵
通過其鍵檢索值
確定Properties對象是否為空
安全考慮因素:對屬性的訪問必須經(jīng)過當(dāng)前安全管理器的批準(zhǔn),假定本節(jié)中的示例代碼段位于獨(dú)立應(yīng)用程序中,默認(rèn)情況下,它們沒有安全管理器,applet中的相同代碼可能無法運(yùn)行,具體取決于運(yùn)行它的瀏覽器,有關(guān)applet安全性限制的信息,請參閱Java Applets課程中Applets可以做什么和不能做什么。
System類維護(hù)一個(gè)Properties對象,該對象定義當(dāng)前工作環(huán)境的配置,有關(guān)這些屬性的更多信息,請參閱系統(tǒng)屬性,本節(jié)的其余部分介紹了如何使用屬性來管理應(yīng)用程序配置。
應(yīng)用程序生命周期中的屬性
下圖說明了典型應(yīng)用程序如何在執(zhí)行過程中使用Properties對象管理其配置數(shù)據(jù)。
Starting Up
前三個(gè)框中給出的操作在應(yīng)用程序啟動(dòng)時(shí)發(fā)生。首先,應(yīng)用程序?qū)⒛J(rèn)屬性從一個(gè)眾所周知的位置加載到Properties對象中,通常,默認(rèn)屬性與應(yīng)用程序的.class和其他資源文件一起存儲(chǔ)在磁盤上的文件中。
接下來,應(yīng)用程序創(chuàng)建另一個(gè)Properties對象,并加載上次運(yùn)行應(yīng)用程序時(shí)保存的屬性,許多應(yīng)用程序基于每個(gè)用戶存儲(chǔ)屬性,因此在此步驟中加載的屬性通常位于此應(yīng)用程序在用戶主目錄中維護(hù)的特定目錄中的特定文件中,最后,應(yīng)用程序使用默認(rèn)和記住的屬性來初始化自身。
這里的關(guān)鍵是一致性,應(yīng)用程序必須始終將屬性加載并保存到同一位置,以便下次執(zhí)行時(shí)可以找到它們。
Running
在執(zhí)行應(yīng)用程序期間,用戶可能會(huì)在“首選項(xiàng)”窗口中更改某些設(shè)置,并更新Properties對象以反映這些更改,如果要在將來的會(huì)話中記住用戶更改,則必須保存它們。
Exiting
退出時(shí),應(yīng)用程序?qū)傩员4娴狡湟阎恢?#xff0c;以便在下次啟動(dòng)應(yīng)用程序時(shí)再次加載。
設(shè)置屬性對象
以下Java代碼執(zhí)行上一節(jié)中描述的前兩個(gè)步驟:加載默認(rèn)屬性并加載記住的屬性:
. . .
// create and load default properties
Properties defaultProps = new Properties();
FileInputStream in = new FileInputStream("defaultProperties");
defaultProps.load(in);
in.close();
// create application properties with default
Properties applicationProps = new Properties(defaultProps);
// now load properties
// from last invocation
in = new FileInputStream("appProperties");
applicationProps.load(in);
in.close();
. . .
首先,應(yīng)用程序設(shè)置默認(rèn)的Properties對象,如果未在其他位置顯式設(shè)置值,則此對象包含要使用的屬性集,然后,load方法從名為defaultProperties的磁盤上的文件中讀取默認(rèn)值。
接下來,應(yīng)用程序使用不同的構(gòu)造函數(shù)來創(chuàng)建第二個(gè)Properties對象applicationProps,其默認(rèn)值包含在defaultProps中,在檢索屬性時(shí),默認(rèn)值開始起作用,如果在applicationProps中找不到該屬性,則搜索其默認(rèn)列表。
最后,代碼從名為appProperties的文件中將一組屬性加載到applicationProps中,此文件中的屬性是上次調(diào)用時(shí)從應(yīng)用程序保存的屬性,如下一節(jié)中所述。
保存屬性
以下示例使用Properties.store從上一個(gè)示例中寫出應(yīng)用程序?qū)傩?#xff0c;每次都不需要保存默認(rèn)屬性,因?yàn)樗鼈冇肋h(yuǎn)不會(huì)更改。
FileOutputStream out = new FileOutputStream("appProperties");
applicationProps.store(out, "---No Comment---");
out.close();
store方法需要一個(gè)要寫入的流,以及一個(gè)用作輸出頂部注釋的字符串。
獲取屬性信息
應(yīng)用程序設(shè)置其Properties對象后,應(yīng)用程序可以查詢對象以獲取有關(guān)其包含的各種鍵和值的信息,應(yīng)用程序在啟動(dòng)后從Properties對象獲取信息,以便它可以根據(jù)用戶的選擇初始化自身,Properties類有幾種獲取屬性信息的方法:
contains(Object value)和containsKey(Object key)
如果值或鍵位于Properties對象中,則返回true,屬性從Hashtable繼承這些方法,因此,它們接受Object參數(shù),但只應(yīng)使用String值。
getProperty(String key)和getProperty(String key, String default)
返回指定屬性的值,第二個(gè)版本提供默認(rèn)值,如果未找到鍵,則返回默認(rèn)值。
list(PrintStream s)和list(PrintWriter w)
將所有屬性寫入指定的流或?qū)懭肫?#xff0c;這對調(diào)試很有用。
elements()、keys()、和propertyNames()
返回包含Properties對象中包含的鍵或值(由方法名稱指示)的Enumeration,keys方法只返回對象本身的鍵,propertyNames方法也返回默認(rèn)屬性的鍵。
stringPropertyNames()
與propertyNames類似,但返回Set,并且僅返回其中鍵和值都是字符串的屬性的名稱,請注意,Set對象不受Properties對象的支持,因此一個(gè)對象的更改不會(huì)影響另一個(gè)。
size()
返回當(dāng)前鍵/值對的數(shù)量。
設(shè)置屬性
在執(zhí)行期間用戶與應(yīng)用程序的交互可能會(huì)影響屬性設(shè)置,這些更改應(yīng)反映在Properties對象中,以便在應(yīng)用程序退出時(shí)保存它們(并調(diào)用store方法),以下方法更改Properties對象中的屬性:
setProperty(String key, String value)
將鍵/值對放在Properties對象中。
remove(Object key)
移除與鍵關(guān)聯(lián)的鍵/值對。
上面描述的一些方法是在Hashtable中定義的,因此接受除String之外的鍵和值參數(shù)類型,始終使用字符串作為鍵和值,即使該方法允許其他類型,也不要在Properties對象上調(diào)用Hashtable.set或Hastable.setAll,始終使用Properties.setProperty。
命令行參數(shù)
Java應(yīng)用程序可以從命令行接受任意數(shù)量的參數(shù),這允許用戶在啟動(dòng)應(yīng)用程序時(shí)指定配置信息。
用戶在調(diào)用應(yīng)用程序時(shí)輸入命令行參數(shù),并在要運(yùn)行的類的名稱后指定它們。例如,假設(shè)一個(gè)名為Sort的Java應(yīng)用程序?qū)ξ募械男羞M(jìn)行排序,要對名為friends.txt的文件中的數(shù)據(jù)進(jìn)行排序,用戶將輸入:
java Sort friends.txt
啟動(dòng)應(yīng)用程序時(shí),運(yùn)行時(shí)系統(tǒng)會(huì)通過字符串?dāng)?shù)組將命令行參數(shù)傳遞給應(yīng)用程序的main方法,在前面的示例中,命令行參數(shù)在包含單個(gè)String:“friends.txt”的數(shù)組中傳遞給Sort應(yīng)用程序。
回應(yīng)命令行參數(shù)
Echo示例單獨(dú)在一行上顯示其每個(gè)命令行參數(shù):
public class Echo {
public static void main (String[] args) {
for (String s: args) {
System.out.println(s);
}
}
}
以下示例顯示用戶如何運(yùn)行Echo:
java Echo Drink Hot Java
Drink
Hot
Java
請注意,應(yīng)用程序單獨(dú)顯示每個(gè)單詞 — Drink、Hot和Java,這是因?yàn)榭崭褡址指袅嗣钚袇?shù),要將Drink、Hot和Java解釋為單個(gè)參數(shù),用戶可以通過將它們括在引號(hào)內(nèi)來加入它們。
java Echo "Drink Hot Java"
Drink Hot Java
解析數(shù)字命令行參數(shù)
如果應(yīng)用程序需要支持?jǐn)?shù)字命令行參數(shù),它必須將表示數(shù)字的String參數(shù)(例如“34”)轉(zhuǎn)換為數(shù)字值,這是一個(gè)將命令行參數(shù)轉(zhuǎn)換為int的代碼片段:
int firstArg;
if (args.length > 0) {
try {
firstArg = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.err.println("Argument" + args[0] + " must be an integer.");
System.exit(1);
}
}
如果args[0]的格式無效,則parseInt會(huì)拋出NumberFormatException,所有Number類 — Integer、Float、Double等 — 都有parseXXX方法,它們將表示數(shù)字的String轉(zhuǎn)換為其類型的對象。
環(huán)境變量
許多操作系統(tǒng)使用環(huán)境變量將配置信息傳遞給應(yīng)用程序,與Java平臺(tái)中的屬性一樣,環(huán)境變量是鍵/值對,其中鍵和值都是字符串,設(shè)置和使用環(huán)境變量的約定因操作系統(tǒng)和命令行解釋器之間而異,要了解如何將環(huán)境變量傳遞給系統(tǒng)上的應(yīng)用程序,請參閱系統(tǒng)文檔。
查詢環(huán)境變量
在Java平臺(tái)上,應(yīng)用程序使用System.getenv來檢索環(huán)境變量值,如果沒有參數(shù),getenv將返回java.util.Map的只讀實(shí)例,其中映射鍵是環(huán)境變量名稱,映射值是環(huán)境變量值,這在EnvMap示例中進(jìn)行了演示:
import java.util.Map;
public class EnvMap {
public static void main (String[] args) {
Map env = System.getenv();
for (String envName : env.keySet()) {
System.out.format("%s=%s%n",
envName,
env.get(envName));
}
}
}
使用String參數(shù),getenv返回指定變量的值,如果未定義變量,則getenv返回null,Env示例使用getenv以這種方式查詢在命令行上指定的特定環(huán)境變量:
public class Env {
public static void main (String[] args) {
for (String env: args) {
String value = System.getenv(env);
if (value != null) {
System.out.format("%s=%s%n",
env, value);
} else {
System.out.format("%s is"
+ " not assigned.%n", env);
}
}
}
}
將環(huán)境變量傳遞給新進(jìn)程
當(dāng)Java應(yīng)用程序使用ProcessBuilder對象創(chuàng)建新進(jìn)程時(shí),傳遞給新進(jìn)程的默認(rèn)環(huán)境變量集與提供給應(yīng)用程序虛擬機(jī)進(jìn)程的集合相同,應(yīng)用程序可以使用ProcessBuilder.environment更改此集。
平臺(tái)依賴問題
在不同系統(tǒng)上實(shí)現(xiàn)環(huán)境變量的方式之間存在許多細(xì)微差別,例如,Windows忽略環(huán)境變量名稱中的大小寫,而UNIX則不會(huì)。使用環(huán)境變量的方式也各不相同,例如,Windows在名為USERNAME的環(huán)境變量中提供用戶名,而UNIX實(shí)現(xiàn)可能在USER、LOGNAME或兩者中提供用戶名。
為了最大化可移植性,當(dāng)系統(tǒng)屬性中的相同值可用時(shí),請不要引用環(huán)境變量,例如,如果操作系統(tǒng)提供用戶名,則它將始終在系統(tǒng)屬性user.name中可用。
其他配置實(shí)用程序
以下是一些其他配置實(shí)用程序的匯總。
Preferences API允許應(yīng)用程序在依賴于實(shí)現(xiàn)的備份存儲(chǔ)中存儲(chǔ)和檢索配置數(shù)據(jù),支持異步更新,并且多個(gè)線程甚至多個(gè)應(yīng)用程序可以安全地更新同一組首選項(xiàng),有關(guān)更多信息,請參閱Preferences API指南。
部署在JAR存檔中的應(yīng)用程序使用manifest來描述存檔的內(nèi)容,有關(guān)更多信息,請參閱JAR文件中的打包程序課程。
Java Web Start應(yīng)用程序的配置包含在JNLP文件中,有關(guān)更多信息,請參閱Java Web Start課程。
Java Plug-in applet的配置部分取決于用于在網(wǎng)頁中嵌入applet的HTML標(biāo)記,這些標(biāo)記可以包含、、和,具體取決于applet和瀏覽器,有關(guān)更多信息,請參閱Java Applets課程。
java.util.ServiceLoader類提供了一個(gè)簡單的service provider設(shè)施,service provider是service的實(shí)現(xiàn) — 一組眾所周知的接口和(通常是抽象的)類。service provider中的類通常實(shí)現(xiàn)接口并子類化service中定義的類,service provider可以作為擴(kuò)展安裝(請參閱擴(kuò)展機(jī)制),通過將Providers添加到類路徑或通過其他特定于平臺(tái)的方式,也可以使Providers可用。
總結(jié)
以上是生活随笔為你收集整理的java工具配置_Java™ 教程(配置实用工具)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java event 异步_[转]jav
 - 下一篇: java中迭代方式_JAVA中LIST迭