Java程序在不同操作系統(tǒng)上運行時,可能需要獲取平臺相關(guān)的屬性,或調(diào)用平臺命令來完成特定功能。
此時需要System、Runtime類來與程序的運行平臺進行交互
目錄導(dǎo)讀:
System類
|
?類變量(in, out, err)
?獲取當(dāng)前時間(本地方法)
?垃圾回收/資源回收(依賴Runtime類實現(xiàn)的)
?退出JVM(依賴Runtime類實現(xiàn)的)
?訪問環(huán)境變量、系統(tǒng)屬性
?載入動態(tài)鏈接庫/加載文件
?返回對象的精確的hashCode值
Runtime類
|
?得到Runtime實例
?垃圾回收/資源回收(本地方法)
?執(zhí)行所在操作系統(tǒng)的命令
?退出JVM
?訪問JvM的相關(guān)信息
?載入動態(tài)鏈接庫/加載文件
1.System類
System類代表當(dāng)前Java程序的運行平臺
1.不可以獲取System實例
private System() {
}
因此,其所有的變量和方法必須而且也是設(shè)置為static的
2.類變量(in, out, err)
public final static InputStream in = null; //標(biāo)準(zhǔn)輸入(鍵盤)
public final static PrintStream out = null; //標(biāo)準(zhǔn)輸出(控制臺,即顯示器)
public final static PrintStream err = null; //標(biāo)準(zhǔn)錯誤輸出流
重定向標(biāo)準(zhǔn)輸入/輸出流
//重定向標(biāo)準(zhǔn)輸入流
public static void setIn(InputStream in) {
checkIO();
setIn0(in); //本地方法 private static native void setIn0(InputStream in);
}
//重定向標(biāo)準(zhǔn)輸出流
public static void setOut(PrintStream out) {
checkIO();
setOut0(out); //本地方法 private static native void setOut0(PrintStream out);
}
//重定向錯誤輸出流
public static void setErr(PrintStream err) {
checkIO();
setErr0(err); //本地方法 private static native void setErr0(PrintStream err);
}
3.獲取當(dāng)前時間(返回的時間精度與所在平臺相關(guān))
返回的是當(dāng)前時間與UTC1970年1月1日午夜的時間差
public static native long currentTimeMillis(); //返回以毫秒做單位的當(dāng)前時間
public static native long nanoTime(); //返回以納秒的做單位當(dāng)前時間
4.垃圾回收
public static void gc() {
Runtime.getRuntime().gc(); //借助Runtime的相關(guān)方法
}
5.資源清理
public static void runFinalization() {
Runtime.getRuntime().runFinalization();
}
6.退出JVM(程序退出)
public static void exit(int status) {
Runtime.getRuntime().exit(status); //借助于Runtime的方法
}
7.訪問環(huán)境變量、系統(tǒng)屬性
因為涉及到訪問操作系統(tǒng)底層硬件設(shè)備,Java程序已無法完成,只能借助于C語言來完成,
即需要使用C語言為Java方法提供實現(xiàn)。具體見《瘋狂Java講義3版》P243
8.載入動態(tài)鏈接庫/加載文件
9.返回對象的精確的hashCode值(本地方法)
該方法返回指定對象的hashCode值是根據(jù)該對象的地址計算得到的hashCode值,因此它是能唯一標(biāo)識該對象
public static native int identityHashCode(Object x);
2.Runtime類
Runtime類代表Java程序的運行時環(huán)境
每個Java程序都有一個(有且只有一個)與之對應(yīng)的Runtime實例,應(yīng)用程序通過該對象與其運行時環(huán)境相連。可以獲取訪問JVM的相關(guān)信息,如處理器數(shù)量、內(nèi)存信息等
1.得到Runtime實例
應(yīng)用程序不能自己創(chuàng)建自己的Runtime實例,只能通過getRuntime()方法獲取與之關(guān)聯(lián)的Runtime對象
private static Runtime currentRuntime = new Runtime(); //每個Java程序只有一個Runtime實例
public static Runtime getRuntime() {
return currentRuntime;
}
2.不允許外界通過new的方式創(chuàng)建實例
private Runtime() {}
3.垃圾回收
public native void gc(); //通知系統(tǒng)本地進行垃圾回收
4.資源清理
public void runFinalization() {
runFinalization0(); //通知系統(tǒng)本地進行系統(tǒng)資源清理
}
private static native void runFinalization0();
5.執(zhí)行所在操作系統(tǒng)的命令
單獨開啟一個進程來運行操作系統(tǒng)的命令
public Process exec(String command) throws IOException {
return exec(command, null, null); //具體依賴ProcessBuilder類來實現(xiàn)的
}
注:結(jié)合該方法和IO流可以運行Java虛擬機,從而即可運行另一個Java程序
6.退出JVM(程序退出)
//status為0是正常終止程序,非0是異常終止程序
public void exit(int status) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkExit(status);
}
Shutdown.exit(status);
}
7.訪問JvM的相關(guān)信息
如處理器數(shù)量、內(nèi)存信息等
8.載入動態(tài)鏈接庫/加載文件