java.lang.System 為 final 工具類,提供**標準輸入輸出、系統屬性、環境變數、時間戳、垃圾回收提示、JVM 退出**等核心功能。所有方法皆為 static,不可實例化。
| 方法 | 回傳/作用 | 常見用途 |
|---|---|---|
currentTimeMillis() | long 毫秒時間戳 (UTC 1970) | 計時、日誌、快取過期、唯一 ID 前綴 |
nanoTime() | long 奈秒相對時間 | **高精度效能測量** (不受系統時間調整影響) |
getProperties() | Properties 系統屬性快照 | 讀取 os.name, java.version, user.dir 等 |
getProperty(key) / getProperty(key, def) | String | 單一屬性讀取,支援預設值 |
setProperty(key, value) | String (舊值) | 運行時覆寫系統屬性 (謹慎使用) |
getenv() / getenv(name) | Map<String,String> / String | 讀取作業系統環境變數 |
exit(status) | void (不返回) | 終止 JVM,0=正常,非 0=異常 |
gc() | void | **建議** 執行 GC,不保證立即執行 |
arraycopy(src, srcPos, dest, destPos, len) | void | 高效陣列複製 (JNI 實作,比迴圈快) |
identityHashCode(obj) | int | 物件原始雜湊碼 (忽略覆寫 hashCode) |
import java.util.Properties;
public class SystemDemo {
public static void main(String[] args) {
// 1. 高精度計時
long start = System.nanoTime();
// do something
long elapsedMs = (System.nanoTime() - start) / 1_000_000;
System.out.println("耗時: " + elapsedMs + " ms");
// 2. 讀取系統屬性
String os = System.getProperty("os.name");
String javaVer = System.getProperty("java.version");
System.out.println("OS: " + os + ", Java: " + javaVer);
// 3. 列出所有屬性
Properties props = System.getProperties();
props.forEach((k, v) -> System.out.println(k + " = " + v));
// 4. 自定義屬性 (僅影響當前 JVM)
System.setProperty("my.app.config", "/etc/myapp");
System.out.println("Custom: " + System.getProperty("my.app.config"));
// 5. 環境變數
String home = System.getenv("HOME"); // Linux/Mac
if (home == null) home = System.getenv("USERPROFILE"); // Windows
System.out.println("Home: " + home);
// 6. 標準流
System.out.println("標準輸出");
System.err.println("標準錯誤輸出");
// System.in 為 InputStream,可包裝 Scanner/BufferedReader
// 7. 陣列高效複製
int[] src = {1,2,3,4,5};
int[] dest = new int[5];
System.arraycopy(src, 0, dest, 0, src.length);
// 8. 退出 JVM (謹慎)
// System.exit(0);
}
}
// 將 System.out 導向檔案
PrintStream fileOut = new PrintStream(new FileOutputStream("app.log"));
System.setOut(fileOut);
System.out.println("這行會寫入 app.log");
// 還原
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
currentTimeMillis() 受系統時鐘調整影響 (NTP 同步、使用者改時間),**測量間隔必須用 nanoTime()**。setProperty 僅影響當前 JVM 進程,不會寫回磁碟或影響其他進程。exit() 會觸發 ShutdownHook (via Runtime.addShutdownHook),但不會執行 finally 區塊 (除非在 Hook 中)。gc() 只是建議,**生產代碼勿依賴** 其行為。