国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

馴服Tiger之訪問環境變量和調用子進程

2019-11-18 15:39:58
字體:
來源:轉載
供稿:網友

  訪問平臺專有的信息并不是一件輕易的事。雖然可以使用 Runtime.exec() 創建進程,但由于平臺之間的差異,構造參數集經常令人頭痛不已。此外, System 的 getenv() 方法從開始進行 java 編程就遭到反對。

  什么時候一個遭到反對的方法不再被反對呢?使用 System 的 getenv() 方法時就會碰到這種情況。Tiger 以 1995 年正式發布之前的 Java 平臺為基礎,它沒有拋棄該方法,同時還提供了一個新的類 PRocessBuilder (屬于包 java.lang ),用它來創建進程并與系統進程交互。

  訪問環境變量

  雖然我個人并不想退回到原來使用 AWT 組件的事件模型,但是早期的 Java 平臺版本(稱為 alpha 版)有一個很好的特性,即能夠訪問環境變量。該方法和當時“編寫一次,隨處運行”的頌詞背道而馳,因此當 Java 平臺發布 1.0 版時, System 的 getenv() 方法受到了抨擊。雖然 1.0 版為何拋棄原來的一些內容一直令我迷惑不解,但我經??吹皆摲椒ㄒ鹦氯腴T開發人員的愛好。時間回到 2004 年,您現在終于能夠使用這個方法了。如清單 1 所示,該方法的使用很簡單:

  清單 1. 調用 getenv

public class EnvTest {
 public static void main(String args[]) {
  System.out.println(System.getenv(args[0]));
 }
}
  只要在命令行中隨 getenv 調用傳入變量的名稱,就可以得到它的當前值。比如在我那臺用了兩年的桌面機上,假如輸入參數 PROCESSOR_IDENTIFIER ,就會得到清單 2 所示的結果:

  清單 2. getenv 的輸出結果

java EnvTest PROCESSOR_IDENTIFIER
x86 Family 6 Model 8 Stepping 6, GenuineIntel
  首先要注重的是方法名 getenv() ,它完全采用小寫形式,而不是采用您所預料的大小寫混合形式( getEnv() )。這是因為在正式發布之前的最初命名方法就是這樣的。其次,訪問環境變量經常要使用平臺專用的代碼。假如確實希望這樣做也可以,但這樣就偏離了百分之百的純 Java 模型。上述代碼本身仍然是純粹的 Java 代碼,因此使用該方法并不完全違反這一原則,但是使用了這么多年的系統屬性之后,使用 getenv() 感覺怪怪的。

  Tiger 提供了兩個版本的 getenv() 方法,而不是一個。第二個版本返回與系統中當前設置的所有環境變量對應的‘名/值’對(name-value pairs)。清單 3 說明了這種新方法的應用,并打印出了所有環境變量的鍵和值:

  清單 3. 訪問所有的環境變量

import java.util.Map;

public class EnvDump {
 public static void main(String args[]) {
  for (Map.Entry entry: System.getenv().entrySet()) {
   System.out.println(entry.getKey() + " / " +
   entry.getValue());
  }
 }
}進入討論組討論。
理解 ProcessBuilder

  這為我們帶來了一個新的類 java.lang.ProcessBuilder 。平臺的早期版本答應通過 Runtime 類的 exec() 方法創建本機進程。該方法仍然有效,但是因為能以 String 數組作為參數、以 File 參數作為工作目錄,所以用這種方法定制子進程比較困難。使用 ProcessBuilder 可以簡化這個過程,它提供了 Directory(File) 方法來改變進程的工作目錄,可以用 environment() 方法在進程空間中添加和刪除環境變量。清單 4 說明了 ProcessBuilder 的一種簡單用法,它使用 ipconfig 命令獲得 Internet 配置信息。該方法適用于多數平臺,否則可以將 ipconfig 改寫成所用平臺上的工作命令。啟動進程構造程序之后,需要獲得其 InputStream ,以讀入所創建進程的結果。

  清單 4. 使用 ProcessBuilder

import java.io.*;

public class ProcessTest {
 public static void main(String args[]) throws IOException {
  Process p = new ProcessBuilder("ipconfig").start();
  InputStream is = p.getInputStream();
  BufferedReader br = new BufferedReader(new InputStreamReader(is));
  String line;
  while ((line = br.readLine()) != null) {
   System.out.println(line);
  }
 }
}
  如清單 5 所示,該程序的運行結果與在命令行中執行 ipconfig 所得到的結果類似(您得到的結果看起來可能有所不同):

  清單 5. ProcessBuilder 的輸出結果



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麻江县| 兴义市| 昭通市| 永康市| 安西县| 荆州市| 百色市| 永昌县| 灯塔市| 南澳县| 商都县| 阳东县| 饶阳县| 日照市| 专栏| 大兴区| 阜康市| 永善县| 鞍山市| 轮台县| 石首市| 黄大仙区| 永州市| 林甸县| 如东县| 林周县| 密云县| 英吉沙县| 仙居县| 白河县| 阜平县| 岱山县| 昭苏县| 商城县| 北流市| 吴忠市| 辽阳市| 海淀区| 松阳县| 正镶白旗| 嘉善县|