Java™ 教程(配置實用工具)

配置實用工具

本節介紹一些幫助應用程序訪問其啓動上下文的配置實用程序。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對象管理其配置數據。數組

environment-1loads.gif

  • 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中找不到該屬性,則搜索其默認列表。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對象中包含的鍵或值(由方法名稱指示)的Enumerationkeys方法只返回對象自己的鍵,propertyNames方法也返回默認屬性的鍵。
  • stringPropertyNames()
    propertyNames相似,但返回Set<String>,而且僅返回其中鍵和值都是字符串的屬性的名稱,請注意,Set對象不受Properties對象的支持,所以一個對象的更改不會影響另外一個。
  • size()
    返回當前鍵/值對的數量。

設置屬性

在執行期間用戶與應用程序的交互可能會影響屬性設置,這些更改應反映在Properties對象中,以便在應用程序退出時保存它們(並調用store方法),如下方法更改Properties對象中的屬性:

  • setProperty(String key, String value)
    將鍵/值對放在Properties對象中。
  • remove(Object key)
    移除與鍵關聯的鍵/值對。
上面描述的一些方法是在 Hashtable中定義的,所以接受除 String以外的鍵和值參數類型,始終使用字符串做爲鍵和值,即便該方法容許其餘類型,也不要在 Properties對象上調用 Hashtable.setHastable.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類 — IntegerFloatDouble等 — 都有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返回nullEnv示例使用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實現可能在USERLOGNAME或二者中提供用戶名。

爲了最大化可移植性,當系統屬性中的相同值可用時,請不要引用環境變量,例如,若是操做系統提供用戶名,則它將始終在系統屬性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可用。


上一篇:原子變量

下一篇:系統實用工具

相關文章
相關標籤/搜索