java工具配置_Java™ 教程(配置实用工具)
配置實用工具
本節介紹一些幫助應用程序訪問其啟動上下文的配置實用程序。
屬性
Properties是作為鍵/值對管理的配置值,在每對中,鍵和值都是字符串值,鍵標識并用于檢索值,就像變量名用于檢索變量的值一樣。例如,能夠下載文件的應用程序可能使用名為“download.lastDirectory”的屬性來跟蹤上次下載所使用的目錄。
要管理屬性,請創建java.util.Properties的實例,此類提供以下方法:
將鍵/值對從流中加載到Properties對象中
從其鍵中檢索值
列出鍵及其值
枚舉鍵
將屬性保存到流
有關流的介紹,請參閱基礎I/O課程中的I/O流部分。
Properties擴展了java.util.Hashtable,從Hashtable繼承的一些方法支持以下操作:
測試以查看特定鍵或值是否在Properties對象中
獲取當前鍵/值對的數量
移除鍵及其值
將鍵/值對添加到Properties列表中
枚舉值或鍵
通過其鍵檢索值
確定Properties對象是否為空
安全考慮因素:對屬性的訪問必須經過當前安全管理器的批準,假定本節中的示例代碼段位于獨立應用程序中,默認情況下,它們沒有安全管理器,applet中的相同代碼可能無法運行,具體取決于運行它的瀏覽器,有關applet安全性限制的信息,請參閱Java Applets課程中Applets可以做什么和不能做什么。
System類維護一個Properties對象,該對象定義當前工作環境的配置,有關這些屬性的更多信息,請參閱系統屬性,本節的其余部分介紹了如何使用屬性來管理應用程序配置。
應用程序生命周期中的屬性
下圖說明了典型應用程序如何在執行過程中使用Properties對象管理其配置數據。
Starting Up
前三個框中給出的操作在應用程序啟動時發生。首先,應用程序將默認屬性從一個眾所周知的位置加載到Properties對象中,通常,默認屬性與應用程序的.class和其他資源文件一起存儲在磁盤上的文件中。
接下來,應用程序創建另一個Properties對象,并加載上次運行應用程序時保存的屬性,許多應用程序基于每個用戶存儲屬性,因此在此步驟中加載的屬性通常位于此應用程序在用戶主目錄中維護的特定目錄中的特定文件中,最后,應用程序使用默認和記住的屬性來初始化自身。
這里的關鍵是一致性,應用程序必須始終將屬性加載并保存到同一位置,以便下次執行時可以找到它們。
Running
在執行應用程序期間,用戶可能會在“首選項”窗口中更改某些設置,并更新Properties對象以反映這些更改,如果要在將來的會話中記住用戶更改,則必須保存它們。
Exiting
退出時,應用程序將屬性保存到其已知位置,以便在下次啟動應用程序時再次加載。
設置屬性對象
以下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中找不到該屬性,則搜索其默認列表。
最后,代碼從名為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,并且僅返回其中鍵和值都是字符串的屬性的名稱,請注意,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 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和瀏覽器,有關更多信息,請參閱Java Applets課程。
java.util.ServiceLoader類提供了一個簡單的service provider設施,service provider是service的實現 — 一組眾所周知的接口和(通常是抽象的)類。service provider中的類通常實現接口并子類化service中定義的類,service provider可以作為擴展安裝(請參閱擴展機制),通過將Providers添加到類路徑或通過其他特定于平臺的方式,也可以使Providers可用。
總結
以上是生活随笔為你收集整理的java工具配置_Java™ 教程(配置实用工具)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java event 异步_[转]jav
- 下一篇: java增强型for报错_Java基础—