1. 程式人生 > >java中System.getProperty()和System.setProperty()和System.getProperties()

java中System.getProperty()和System.setProperty()和System.getProperties()

System可以有對標準輸入,標準輸出,錯誤輸出流;對外部定義的屬性和環境變數的訪問;載入檔案和庫的方法;還有快速複製陣列的一部分的實用方法。
System.getProperties()可以確定當前的系統屬性,返回值是一個Properties;
System.load(String filename)等同於:System.getProperties().load(String filename)它們的作用是可以從作為動態庫德本地檔案系統中指定的檔名載入程式碼檔案。
System.setProperties(Properties propes):將系統屬性設定為Properties引數;
System.setProperties(String key,String value)等同於System.getProperties().setProperties(String key,String value):設定指定鍵指示的系統屬性
對於在程式中如果我們想得到一個資原始檔中對應的鍵值對的內容,可以有兩種方法:
1)使用Properties的load方法,將這個檔案先載入進來,之後使用getProperty方法將對應鍵的值得到,比如:
System.getProperties().load(“System.Properties.txt”);先載入System.Properties.txt檔案
System.getProperties().getProperty(“DBType”);後將檔案中鍵為DBType的值得到。
2)使用第一種方法鍵對應的值得靈活性比較大。還有一種方法是將不從檔案中得到鍵對應的值。在程式中去設一個屬性,比如:
System.getProperties().setProperty(“DBType”,”SQLServer”);先設定一個鍵位DBType的屬性
System.getProperties().getProperty(“DBType”);後通過getProperty方法得到DBType的值。
另外使用Properties.getProperty方法的引數也可以使用系統的一些環境變數,列表如下:
Key Meaning
——————- ——————————
“file.separator” File separator (e.g., “/”)
“java.class.path” Java classpath
“java.class.version” Java class version number
“java.home” Java installation directory
“java.vendor” Java vendor-specific string
“java.vendor.url” Java vendor URL
“java.version” Java version number
“line.separator” Line separator
“os.arch” Operating system architecture
“os.name” Operating system name
“path.separator” Path separator (e.g., “:”)
“user.dir” User’s current working directory
“user.home” User home directory
“user.name” User account name

使用其中的key可以得到一些屬性,供我們在程式中使用

備註:
Microsoft VM是WIN32操作環境中的虛擬機器,VM一般安裝在大多數作業系統下,也包含在多數IE中。
Microsoft VM存在漏洞允許攻擊者對user.dir屬性進行訪問。user.dir屬性包含當前應用程式的工作目錄資訊,也包含使用者名稱資訊,利用這個漏洞可以獲得當前使用者名稱稱。
可以利用WEB頁和HTML形式郵件來觸發。
Java獲取當前系統的編碼方式:
Properties initProp = new Properties(System.getProperties()); System.out.println(“file.encoding:”+initProp.getProperty(“file.encoding”)); System.out.println(“file.encoding:”+initProp.getProperty(“user.language”));

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

package com.mininglamp.util;

import java.io.File;
import java.util.Properties;

public class Test {

public static void main(String[] args) {
    Properties pro= System.getProperties();
    System.out.println(System.getenv());
    System.out.println(pro.getProperty("user.dir"));
    String currentDir = System.getProperty("user.dir");
    System.out.println(currentDir);
    String path = currentDir + File.separator + "conf" + File.separator + "config.properties";
    System.out.println(path);
    System.out.println(System.getProperty("java.version"));// 1.8.0_144
    System.out.println(System.getProperty("java.vendor"));//Oracle Corporation
    System.out.println(System.getProperty("java.vendor.url"));//http://java.oracle.com/
    System.out.println(System.getProperty("java.home"));//D:\java\jre
    System.out.println(System.getProperty("java.vm.specification.version"));//1.8
    System.out.println(System.getProperty("java.vm.specification.vendor"));//Oracle Corporation
    System.out.println(System.getProperty("java.vm.specification.name"));//Java Virtual Machine Specification
    System.out.println(System.getProperty("java.vm.version"));//25.144-b01
    System.out.println(System.getProperty("java.vm.vendor"));//Oracle Corporation
    System.out.println(System.getProperty("java.vm.name"));//Java HotSpot(TM) 64-Bit Server VM
    System.out.println(System.getProperty("java.specification.version"));//1.8
    System.out.println(System.getProperty("java.specification.vendor"));//Oracle Corporation
    System.out.println(System.getProperty("java.specification.name"));//Java Platform API Specification
    System.out.println(System.getProperty("java.class.version"));//52.0
    System.out.println(System.getProperty("java.class.path"));//
    System.out.println(System.getProperty("java.library.path"));//
//  D:\java\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;D:/java/bin/../jre/bin/server;D:/java/bin/../jre/bin;D:/java/bin/../jre/lib/amd64;D:\java\bin;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program File
    System.out.println(System.getProperty("java.io.tmdir"));//null
    System.out.println(System.getProperty("java.compiler"));//null
    System.out.println(System.getProperty("java.ext.dirs"));//D:\java\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
    System.out.println(System.getProperty("os.name"));//Windows 7
    System.out.println(System.getProperty("os.arch"));//amd64
    System.out.println(System.getProperty("os.version"));//6.1
    System.out.println(System.getProperty("file.separator"));// \(windows) /(unix)
    System.out.println(System.getProperty("path.separator"));// ;(windows) :(unix)
    System.out.println(System.getProperty("line.separator"));//在unix系統中是“/n”, window(空行)
    System.out.println(System.getProperty("user.name"));//syf
    System.out.println(System.getProperty("user.home"));//C:\Users\syf
    System.out.println(System.getProperty("user.dir"));//D:\WorkSpaces\SocialGnDomestic
    System.out.println(System.getProperty("file.encoding"));//UTF-8
}

}

3.
用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