【JAVA】System.getProperties()

走在路上的WWB發表於2012-02-11

        System.getProperties()       

分類:            JAVASE2008-03-30 00:034378人閱讀評論(1)收藏舉報

1、java 通過System.getProperties()獲取系統引數

Properties props=System.getProperties(); //系統屬性
   System.out.println("Java的執行環境版本:"+props.getProperty("java.version"));
   System.out.println("Java的執行環境供應商:"+props.getProperty("java.vendor"));
   System.out.println("Java供應商的URL:"+props.getProperty("java.vendor.url"));
   System.out.println("Java的安裝路徑:"+props.getProperty("java.home"));
   System.out.println("Java的虛擬機器規範版本:"+props.getProperty("java.vm.specification.version"));
   System.out.println("Java的虛擬機器規範供應商:"+props.getProperty("java.vm.specification.vendor"));
   System.out.println("Java的虛擬機器規範名稱:"+props.getProperty("java.vm.specification.name"));
   System.out.println("Java的虛擬機器實現版本:"+props.getProperty("java.vm.version"));
   System.out.println("Java的虛擬機器實現供應商:"+props.getProperty("java.vm.vendor"));
   System.out.println("Java的虛擬機器實現名稱:"+props.getProperty("java.vm.name"));
   System.out.println("Java執行時環境規範版本:"+props.getProperty("java.specification.version"));
   System.out.println("Java執行時環境規範供應商:"+props.getProperty("java.specification.vender"));
   System.out.println("Java執行時環境規範名稱:"+props.getProperty("java.specification.name"));
   System.out.println("Java的類格式版本號:"+props.getProperty("java.class.version"));
   System.out.println("Java的類路徑:"+props.getProperty("java.class.path"));
   System.out.println("載入庫時搜尋的路徑列表:"+props.getProperty("java.library.path"));
   System.out.println("預設的臨時檔案路徑:"+props.getProperty("java.io.tmpdir"));
   System.out.println("一個或多個擴充套件目錄的路徑:"+props.getProperty("java.ext.dirs"));
   System.out.println("作業系統的名稱:"+props.getProperty("os.name"));
   System.out.println("作業系統的構架:"+props.getProperty("os.arch"));
   System.out.println("作業系統的版本:"+props.getProperty("os.version"));
   System.out.println("檔案分隔符:"+props.getProperty("file.separator"));   //在 unix 系統中是"/"
   System.out.println("路徑分隔符:"+props.getProperty("path.separator"));   //在 unix 系統中是":"
   System.out.println("行分隔符:"+props.getProperty("line.separator"));   //在 unix 系統中是"/n"
   System.out.println("使用者的賬戶名稱:"+props.getProperty("user.name"));
   System.out.println("使用者的主目錄:"+props.getProperty("user.home"));
   System.out.println("使用者的當前工作目錄:"+props.getProperty("user.dir"));

2、用Java編寫通過代理訪問的應用程式

本技巧將向您講述如何編寫可通過代理訪問因特網上的Web伺服器的Java應用程式。在Java應用程式中加入代理支援只需額外編寫幾行程式碼,且不依賴任何安全性“漏洞”。

將Java和代理結合起來的祕訣即在Java執行時啟用特定的系統屬性。這些屬性未被寫入正式檔案,只是作為Java傳說的一部分在Java程式設計人員中祕傳。為了支援代理,Java應用程式不僅需要指定代理本身的資訊,而且需要指定用於認證的使用者資訊。在開始使用網際協議之前,您需要在程式中新增以下幾行程式碼:
//通知Java您要通過代理進行連線
System.getProperties().put("proxySet","true");

//指定代理所在的伺服器
System.getProperties().put("proxyHost","myProxyMachineName");

//指定代理監聽的埠
System.getProperties().put("proxyPort","85");

 有些代理在授權使用者訪問因特網之前,要求使用者輸入使用者名稱和口令。如果您使用位於防火牆之內的Web瀏覽器,您就可能碰到過這種情況。以下是執行認證的方法:

URLConnection  connection=url.openConnection();
String   password="username:password";
String   encodedPassword=base64Encode(password);
connection.setRequestProperty("Proxy-Authorization",encodedPassword);

  這段程式碼的思想是,您必須調整HTTP標頭以發出使用者資訊。這是通過呼叫setRequestProperty()來實現的。這種方法允許您在發出請求之前處理HTTP標頭。HTTP要求用base64對使用者名稱和口令進行編碼。幸運的是,有一組公用域API,它們將代您執行編碼(請參閱參考資源部分)。

  如您所見,在Java應用程式中加入代理支援並不需要做多少工作。有了現在的知識,再做一點研究(您必須查明您的代理是如何處理您感興趣的協議以及如何進行使用者認證的),您就能用其他協議實現代理。
    HTTP代理:(例子)

Properties props = System.getProperties();

           props.put("http.proxyHost", "192.168.0.150");

           props.put("http.proxyPort", "808");
  FTP代理

  ScottD.Taylor提出這個祕訣來處理FTP協議代理:

defaultProperties.put("ftpProxySet","true");
defaultProperties.put("ftpProxyHost","proxy-host-name");
defaultProperties.put("ftpProxyPort","85");

  接下來您便可以通過以下程式碼使用"ftp"協議訪問檔案URL:

URL  url=newURL("ftp://ftp.netscape.com/pub/navigator/3.04/windows/readme.txt");

  如果有人有使用其他網際協議代理的例子,我很想看看。

  注意:程式碼示例(Example.java)僅在JDK1.1.4下測試過。

  後續技巧!

  對於仍在使用JDK1.1.7(配合WebSphere3.0)的開發人員而言,將proxyHost和proxyPort設為系統屬性不起作用;conn.getInputStream()或者返回連線超時,或者是找不到主機路徑。但是,我使用接受Host和Port為引數的URL建構函式解決了這一問題(使用我的代理主機和埠):

public  URL(String  protocol,String  host,int port,String  file).

  藉助使用者名稱和口令進行認證的方法不起作用。應將"Basic"置於認證字串的開頭;例如:

String  encodedPassword=base64Encode(password);

  應該是:

String  encodedPassword="Basic"+base64Encode(password);

  您也不必用一個單獨的程式來進行64位編碼。您可以使用sun.misc.BASE64Encoder()類。下面是完成這兩處改動之後的程式碼:

System.getProperties().put("proxySet","true");
System.getProperties().put("proxyHost",proxyHost);
System.getProperties().put("proxyPort",proxyPort);
String  authString="userid:password";
String  auth="Basic"+newsun.misc.BASE64Encoder().encode(authString.getBytes());
URL url=newURL("http://java.sun.com/");
URLConnection  conn=url.openConnection();
conn.setRequestProperty("Proxy-Authorization",auth);

  下面是使用socks4代理伺服器的方法:

System.getProperty("socksProxySet",true);
System.getProperty("socksProxyHost",proxyHostName);
System.getProperty("socksProxyPort",proxyPort);
Usually  the  proxyPort  for  Socks 4  is  port  1080

相關文章