本節介紹一些幫助應用程序訪問其啓動上下文的配置實用程序。html
Properties
是做爲鍵/值對管理的配置值,在每對中,鍵和值都是字符串值,鍵標識並用於檢索值,就像變量名用於檢索變量的值同樣。例如,可以下載文件的應用程序可能使用名爲「download.lastDirectory
」的屬性來跟蹤上次下載所使用的目錄。java
要管理屬性,請建立java.util.Properties的實例,此類提供如下方法:git
Properties
對象中有關流的介紹,請參閱基礎I/O課程中的I/O流部分。github
Properties
擴展了java.util.Hashtable,從Hashtable
繼承的一些方法支持如下操做:segmentfault
Properties
對象中Properties
列表中Properties
對象是否爲空安全考慮因素:對屬性的訪問必須通過當前安全管理器的批准,假定本節中的示例代碼段位於獨立應用程序中,默認狀況下,它們沒有安全管理器,applet中的相同代碼可能沒法運行,具體取決於運行它的瀏覽器,有關applet安全性限制的信息,請參閱Java Applets課程中Applets能夠作什麼和不能作什麼。
System
類維護一個Properties
對象,該對象定義當前工做環境的配置,有關這些屬性的更多信息,請參閱系統屬性,本節的其他部分介紹瞭如何使用屬性來管理應用程序配置。api
下圖說明了典型應用程序如何在執行過程當中使用Properties
對象管理其配置數據。數組
Properties
對象中,一般,默認屬性與應用程序的.class
和其餘資源文件一塊兒存儲在磁盤上的文件中。Properties
對象以反映這些更改,若是要在未來的會話中記住用戶更改,則必須保存它們。如下Java代碼執行上一節中描述的前兩個步驟:加載默認屬性並加載記住的屬性:瀏覽器
. . . // 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(); . . .
首先,應用程序設置默認的Properties
對象,若是未在其餘位置顯式設置值,則此對象包含要使用的屬性集,而後,load
方法從名爲defaultProperties
的磁盤上的文件中讀取默認值。安全
接下來,應用程序使用不一樣的構造函數來建立第二個Properties
對象applicationProps
,其默認值包含在defaultProps
中,在檢索屬性時,默認值開始起做用,若是在applicationProps
中找不到該屬性,則搜索其默認列表。oracle
最後,代碼從名爲appProperties
的文件中將一組屬性加載到applicationProps
中,此文件中的屬性是上次調用時從應用程序保存的屬性,以下一節中所述。
如下示例使用Properties.store
從上一個示例中寫出應用程序屬性,每次都不須要保存默認屬性,由於它們永遠不會更改。
FileOutputStream out = new FileOutputStream("appProperties"); applicationProps.store(out, "---No Comment---"); out.close();
store
方法須要一個要寫入的流,以及一個用做輸出頂部註釋的字符串。
應用程序設置其Properties
對象後,應用程序能夠查詢對象以獲取有關其包含的各類鍵和值的信息,應用程序在啓動後從Properties
對象獲取信息,以便它能夠根據用戶的選擇初始化自身,Properties
類有幾種獲取屬性信息的方法:
contains(Object value)
和containsKey(Object key)
Properties
對象中,則返回true
,屬性從Hashtable
繼承這些方法,所以,它們接受Object
參數,但只應使用String
值。getProperty(String key)
和getProperty(String key, String default)
list(PrintStream s)
和list(PrintWriter w)
elements()
、keys()
、和propertyNames()
Properties
對象中包含的鍵或值(由方法名稱指示)的Enumeration
,keys
方法只返回對象自己的鍵,propertyNames
方法也返回默認屬性的鍵。stringPropertyNames()
propertyNames
相似,但返回Set<String>
,而且僅返回其中鍵和值都是字符串的屬性的名稱,請注意,Set
對象不受Properties
對象的支持,所以一個對象的更改不會影響另外一個。size()
在執行期間用戶與應用程序的交互可能會影響屬性設置,這些更改應反映在Properties
對象中,以便在應用程序退出時保存它們(並調用store
方法),如下方法更改Properties
對象中的屬性:
setProperty(String key, String value)
Properties
對象中。remove(Object key)
上面描述的一些方法是在Hashtable
中定義的,所以接受除String
以外的鍵和值參數類型,始終使用字符串做爲鍵和值,即便該方法容許其餘類型,也不要在Properties
對象上調用Hashtable.set
或Hastable.setAll
,始終使用Properties.setProperty
。
Java應用程序能夠從命令行接受任意數量的參數,這容許用戶在啓動應用程序時指定配置信息。
用戶在調用應用程序時輸入命令行參數,並在要運行的類的名稱後指定它們。例如,假設一個名爲Sort
的Java應用程序對文件中的行進行排序,要對名爲friends.txt
的文件中的數據進行排序,用戶將輸入:
java Sort friends.txt
啓動應用程序時,運行時系統會經過字符串數組將命令行參數傳遞給應用程序的main
方法,在前面的示例中,命令行參數在包含單個String
:「friends.txt」的數組中傳遞給Sort
應用程序。
Echo示例單獨在一行上顯示其每一個命令行參數:
public class Echo { public static void main (String[] args) { for (String s: args) { System.out.println(s); } } }
如下示例顯示用戶如何運行Echo
:
java Echo Drink Hot Java Drink Hot Java
請注意,應用程序單獨顯示每一個單詞 — Drink、Hot和Java,這是由於空格字符分隔了命令行參數,要將Drink、Hot和Java解釋爲單個參數,用戶能夠經過將它們括在引號內來加入它們。
java Echo "Drink Hot Java" Drink Hot Java
若是應用程序須要支持數字命令行參數,它必須將表示數字的String
參數(例如「34」)轉換爲數字值,這是一個將命令行參數轉換爲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
方法,它們將表示數字的String
轉換爲其類型的對象。
許多操做系統使用環境變量將配置信息傳遞給應用程序,與Java平臺中的屬性同樣,環境變量是鍵/值對,其中鍵和值都是字符串,設置和使用環境變量的約定因操做系統和命令行解釋器之間而異,要了解如何將環境變量傳遞給系統上的應用程序,請參閱系統文檔。
在Java平臺上,應用程序使用System.getenv來檢索環境變量值,若是沒有參數,getenv
將返回java.util.Map
的只讀實例,其中映射鍵是環境變量名稱,映射值是環境變量值,這在EnvMap示例中進行了演示:
import java.util.Map; public class EnvMap { public static void main (String[] args) { Map<String, String> env = System.getenv(); for (String envName : env.keySet()) { System.out.format("%s=%s%n", envName, env.get(envName)); } } }
使用String
參數,getenv
返回指定變量的值,若是未定義變量,則getenv
返回null
,Env示例使用getenv
以這種方式查詢在命令行上指定的特定環境變量:
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); } } } }
當Java應用程序使用ProcessBuilder對象建立新進程時,傳遞給新進程的默認環境變量集與提供給應用程序虛擬機進程的集合相同,應用程序可使用ProcessBuilder.environment
更改此集。
在不一樣系統上實現環境變量的方式之間存在許多細微差異,例如,Windows忽略環境變量名稱中的大小寫,而UNIX則不會。使用環境變量的方式也各不相同,例如,Windows在名爲USERNAME
的環境變量中提供用戶名,而UNIX實現可能在USER
、LOGNAME
或二者中提供用戶名。
爲了最大化可移植性,當系統屬性中的相同值可用時,請不要引用環境變量,例如,若是操做系統提供用戶名,則它將始終在系統屬性user.name
中可用。
如下是一些其餘配置實用程序的彙總。
Preferences API容許應用程序在依賴於實現的備份存儲中存儲和檢索配置數據,支持異步更新,而且多個線程甚至多個應用程序能夠安全地更新同一組首選項,有關更多信息,請參閱Preferences API指南。
部署在JAR存檔中的應用程序使用manifest
來描述存檔的內容,有關更多信息,請參閱JAR文件中的打包程序課程。
Java Web Start應用程序的配置包含在JNLP文件中,有關更多信息,請參閱Java Web Start課程。
Java Plug-in applet的配置部分取決於用於在網頁中嵌入applet的HTML標記,這些標記能夠包含<applet>、<object>、<embed>和<param>,具體取決於applet和瀏覽器,有關更多信息,請參閱Java Applets課程。
java.util.ServiceLoader類提供了一個簡單的service provider設施,service provider是service的實現 — 一組衆所周知的接口和(一般是抽象的)類。service provider中的類一般實現接口並子類化service中定義的類,service provider能夠做爲擴展安裝(請參閱擴展機制),經過將Providers添加到類路徑或經過其餘特定於平臺的方式,也可使Providers可用。