配置實(shí)用工具
本節(jié)介紹一些幫助應(yīng)用程序訪問其啟動上下文的配置實(shí)用程序。
屬性Properties是作為鍵/值對管理的配置值,在每對中,鍵和值都是字符串值,鍵標(biāo)識并用于檢索值,就像變量名用于檢索變量的值一樣。例如,能夠下載文件的應(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ù)一個Properties對象,該對象定義當(dāng)前工作環(huán)境的配置,有關(guān)這些屬性的更多信息,請參閱系統(tǒng)屬性,本節(jié)的其余部分介紹了如何使用屬性來管理應(yīng)用程序配置。
應(yīng)用程序生命周期中的屬性下圖說明了典型應(yīng)用程序如何在執(zhí)行過程中使用Properties對象管理其配置數(shù)據(jù)。
Starting Up
前三個框中給出的操作在應(yīng)用程序啟動時發(fā)生。首先,應(yīng)用程序?qū)⒛J(rèn)屬性從一個眾所周知的位置加載到Properties對象中,通常,默認(rèn)屬性與應(yīng)用程序的.class和其他資源文件一起存儲在磁盤上的文件中。
接下來,應(yīng)用程序創(chuàng)建另一個Properties對象,并加載上次運(yùn)行應(yīng)用程序時保存的屬性,許多應(yīng)用程序基于每個用戶存儲屬性,因此在此步驟中加載的屬性通常位于此應(yīng)用程序在用戶主目錄中維護(hù)的特定目錄中的特定文件中,最后,應(yīng)用程序使用默認(rèn)和記住的屬性來初始化自身。
這里的關(guān)鍵是一致性,應(yīng)用程序必須始終將屬性加載并保存到同一位置,以便下次執(zhí)行時可以找到它們。
Running
在執(zhí)行應(yīng)用程序期間,用戶可能會在“首選項(xiàng)”窗口中更改某些設(shè)置,并更新Properties對象以反映這些更改,如果要在將來的會話中記住用戶更改,則必須保存它們。
Exiting
退出時,應(yīng)用程序?qū)傩员4娴狡湟阎恢茫员阍谙麓螁討?yīng)用程序時再次加載。
以下Java代碼執(zhí)行上一節(jié)中描述的前兩個步驟:加載默認(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)建第二個Properties對象applicationProps,其默認(rèn)值包含在defaultProps中,在檢索屬性時,默認(rèn)值開始起作用,如果在applicationProps中找不到該屬性,則搜索其默認(rèn)列表。
最后,代碼從名為appProperties的文件中將一組屬性加載到applicationProps中,此文件中的屬性是上次調(diào)用時從應(yīng)用程序保存的屬性,如下一節(jié)中所述。
保存屬性以下示例使用Properties.store從上一個示例中寫出應(yīng)用程序?qū)傩裕看味疾恍枰4婺J(rèn)屬性,因?yàn)樗鼈冇肋h(yuǎn)不會更改。
FileOutputStream out = new FileOutputStream("appProperties"); applicationProps.store(out, "---No Comment---"); out.close();
store方法需要一個要寫入的流,以及一個用作輸出頂部注釋的字符串。
獲取屬性信息應(yīng)用程序設(shè)置其Properties對象后,應(yīng)用程序可以查詢對象以獲取有關(guān)其包含的各種鍵和值的信息,應(yī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)
返回指定屬性的值,第二個版本提供默認(rèn)值,如果未找到鍵,則返回默認(rèn)值。
list(PrintStream s)和list(PrintWriter w)
將所有屬性寫入指定的流或?qū)懭肫鳎@對調(diào)試很有用。
elements()、keys()、和propertyNames()
返回包含Properties對象中包含的鍵或值(由方法名稱指示)的Enumeration,keys方法只返回對象本身的鍵,propertyNames方法也返回默認(rèn)屬性的鍵。
stringPropertyNames()
與propertyNames類似,但返回Set
size()
返回當(dāng)前鍵/值對的數(shù)量。
在執(zhí)行期間用戶與應(yīng)用程序的交互可能會影響屬性設(shè)置,這些更改應(yīng)反映在Properties對象中,以便在應(yīng)用程序退出時保存它們(并調(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ù),這允許用戶在啟動應(yīng)用程序時指定配置信息。
用戶在調(diào)用應(yīng)用程序時輸入命令行參數(shù),并在要運(yùn)行的類的名稱后指定它們。例如,假設(shè)一個名為Sort的Java應(yīng)用程序?qū)ξ募械男羞M(jìn)行排序,要對名為friends.txt的文件中的數(shù)據(jù)進(jìn)行排序,用戶將輸入:
java Sort friends.txt
啟動應(yīng)用程序時,運(yùn)行時系統(tǒng)會通過字符串?dāng)?shù)組將命令行參數(shù)傳遞給應(yīng)用程序的main方法,在前面的示例中,命令行參數(shù)在包含單個String:“friends.txt”的數(shù)組中傳遞給Sort應(yīng)用程序。
回應(yīng)命令行參數(shù)Echo示例多帶帶在一行上顯示其每個命令行參數(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)用程序多帶帶顯示每個單詞 — Drink、Hot和Java,這是因?yàn)榭崭褡址指袅嗣钚袇?shù),要將Drink、Hot和Java解釋為單個參數(shù),用戶可以通過將它們括在引號內(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ù)字值,這是一個將命令行參數(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會拋出NumberFormatException,所有Number類 — Integer、Float、Double等 — 都有parseXXX方法,它們將表示數(shù)字的String轉(zhuǎn)換為其類型的對象。
環(huán)境變量許多操作系統(tǒng)使用環(huán)境變量將配置信息傳遞給應(yīng)用程序,與Java平臺中的屬性一樣,環(huán)境變量是鍵/值對,其中鍵和值都是字符串,設(shè)置和使用環(huán)境變量的約定因操作系統(tǒng)和命令行解釋器之間而異,要了解如何將環(huán)境變量傳遞給系統(tǒng)上的應(yīng)用程序,請參閱系統(tǒng)文檔。
查詢環(huán)境變量在Java平臺上,應(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) { Mapenv = 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)程時,傳遞給新進(jìn)程的默認(rèn)環(huán)境變量集與提供給應(yīng)用程序虛擬機(jī)進(jìn)程的集合相同,應(yīng)用程序可以使用ProcessBuilder.environment更改此集。
平臺依賴問題在不同系統(tǒng)上實(shí)現(xiàn)環(huán)境變量的方式之間存在許多細(xì)微差別,例如,Windows忽略環(huán)境變量名稱中的大小寫,而UNIX則不會。使用環(huán)境變量的方式也各不相同,例如,Windows在名為USERNAME的環(huán)境變量中提供用戶名,而UNIX實(shí)現(xiàn)可能在USER、LOGNAME或兩者中提供用戶名。
為了最大化可移植性,當(dāng)系統(tǒng)屬性中的相同值可用時,請不要引用環(huán)境變量,例如,如果操作系統(tǒng)提供用戶名,則它將始終在系統(tǒng)屬性user.name中可用。
其他配置實(shí)用程序以下是一些其他配置實(shí)用程序的匯總。
Preferences API允許應(yīng)用程序在依賴于實(shí)現(xiàn)的備份存儲中存儲和檢索配置數(shù)據(jù),支持異步更新,并且多個線程甚至多個應(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)記可以包含
java.util.ServiceLoader類提供了一個簡單的service provider設(shè)施,service provider是service的實(shí)現(xiàn) — 一組眾所周知的接口和(通常是抽象的)類。service provider中的類通常實(shí)現(xiàn)接口并子類化service中定義的類,service provider可以作為擴(kuò)展安裝(請參閱擴(kuò)展機(jī)制),通過將Providers添加到類路徑或通過其他特定于平臺的方式,也可以使Providers可用。
上一篇:原子變量 下一篇:系統(tǒng)實(shí)用工具文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/73691.html
摘要:為了達(dá)到這個效果,還需要對開發(fā)工具進(jìn)行設(shè)置。至此,配置幫助文檔就完成了。可以自己調(diào)用一個庫函數(shù)測試一下效果。按照下圖配置即可,這樣是為了使鼠標(biāo)光標(biāo)放到庫函數(shù)上時,幫助信息以小窗口的方式彈出。 ...
摘要:運(yùn)行環(huán)境,它是程序運(yùn)行的所必需的環(huán)境集合。安裝下一步下一步即可,要記得安裝路徑。配置環(huán)境變量安裝完以后需要對系統(tǒng)的環(huán)境變量進(jìn)行配置才能開發(fā)。之所以不能運(yùn)行是因?yàn)檠b類之后還得配置環(huán)境變量。 在了解了Java歷史、特性、作用和跨平臺原理之后,我們可以開始為Java開發(fā)做準(zhǔn)備工作了,只是在此之前我們還需要了解Java的兩大基礎(chǔ)概念JDK(Java Development kit)和JRE(J...
摘要:本博客貓叔的博客,轉(zhuǎn)載請申明出處本系列教程為項(xiàng)目附帶。歷史文章如何在安裝最新版安裝安裝最新版的入門教程的入門教程安裝流程下載的最新資源包,大家也可以關(guān)注我的公眾號貓說,回復(fù)工具包,獲取全部資源工具。或者直接到官網(wǎng)下載,地址下載完成,使用上傳 本博客 貓叔的博客,轉(zhuǎn)載請申明出處本系列教程為HMStrange項(xiàng)目附帶。 歷史文章 如何在VMware12安裝Centos7.6最新版 Ce...
摘要:本博客貓叔的博客,轉(zhuǎn)載請申明出處本系列教程為項(xiàng)目附帶。歷史文章如何在安裝最新版安裝安裝最新版的入門教程的入門教程安裝流程下載的最新資源包,大家也可以關(guān)注我的公眾號貓說,回復(fù)工具包,獲取全部資源工具。或者直接到官網(wǎng)下載,地址下載完成,使用上傳 本博客 貓叔的博客,轉(zhuǎn)載請申明出處本系列教程為HMStrange項(xiàng)目附帶。 歷史文章 如何在VMware12安裝Centos7.6最新版 Ce...
系統(tǒng)實(shí)用工具 System類實(shí)現(xiàn)了許多系統(tǒng)實(shí)用程序,其中一些已在上一節(jié)配置實(shí)用程序中介紹過,本節(jié)介紹一些其他系統(tǒng)實(shí)用程序。 命令行I/O對象 系統(tǒng)提供了幾個預(yù)定義的I/O對象,這些對象在Java應(yīng)用程序中非常有用,可以從命令行啟動,它們實(shí)現(xiàn)了大多數(shù)操作系統(tǒng)提供的標(biāo)準(zhǔn)I/O流,以及用于輸入密碼的控制臺對象,有關(guān)更多信息,請參閱基礎(chǔ)I/O課程中的命令行I/O。 系統(tǒng)屬性 在屬性中,我們研究了應(yīng)用程序可...
閱讀 4270·2021-09-26 10:11
閱讀 2666·2021-07-28 00:37
閱讀 3223·2019-08-29 15:29
閱讀 1178·2019-08-29 15:23
閱讀 3124·2019-08-26 18:37
閱讀 2468·2019-08-26 10:37
閱讀 597·2019-08-23 17:04
閱讀 2347·2019-08-23 13:44