亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

java Runtime類

系統 1774 0

Java的類庫日益龐大,所包含的類和接口也不計其數。但其中有一些非常重要的類和接口,是Java類庫中的核心部分。常見的有String、 Object、Class、Collection、ClassLoader、Runtime、Process...,熟悉這些類是學好Java的基礎。而 這些類一般不容易理解,需要做深入的研究和實踐才能掌握。下面是我對這些類理解和使用的一些總結。歡迎你在閱讀后將你寶貴的意見和讀后感留下!

一、概述

????? Runtime類封裝了運行時的環境。每個 Java 應用程序都有一個 Runtime 類實例,使應用程序能夠與其運行的環境相連接。

????? 一般不能實例化一個Runtime對象,應用程序也不能創建自己的 Runtime 類實例,但可以通過 getRuntime 方法獲取當前Runtime運行時對象的引用。

????? 一旦得到了一個當前的Runtime對象的引用,就可以調用Runtime對象的方法去控制Java虛擬機的狀態和行為。

????? 當Applet和其他不被信任的代碼調用任何Runtime方法時,常常會引起SecurityException異常。

二、API預覽

??? addShutdownHook(Thread hook)

????? 注冊新的虛擬機來關閉掛鉤。 www.87717.com

??? availableProcessors()

????? 向 Java 虛擬機返回可用處理器的數目。

??? exec(String command)

????? 在單獨的進程中執行指定的字符串命令。

??? exec(String[] cmdarray)

????? 在單獨的進程中執行指定命令和變量。

??? exec(String[] cmdarray, String[] envp)

????? 在指定環境的獨立進程中執行指定命令和變量。

??? exec(String[] cmdarray, String[] envp, File dir)

????? 在指定環境和工作目錄的獨立進程中執行指定的命令和變量。

??? exec(String command, String[] envp)

????? 在指定環境的單獨進程中執行指定的字符串命令。

??? exec(String command, String[] envp, File dir)

????? 在有指定環境和工作目錄的獨立進程中執行指定的字符串命令。

??? exit(int status)

????? 通過啟動虛擬機的關閉序列,終止當前正在運行的 Java 虛擬機。

??? freeMemory()

????? 返回 Java 虛擬機中的空閑內存量。

??? gc()

????? 運行垃圾回收器。

??? InputStream getLocalizedInputStream(InputStream in)

????? 已過時。 從 JDK 1.1 開始,將本地編碼字節流轉換為 Unicode 字符流的首選方法是使用 InputStreamReader 和 BufferedReader 類。

??? OutputStream getLocalizedOutputStream(OutputStream out)

????? 已過時。 從 JDK 1.1 開始,將 Unicode 字符流轉換為本地編碼字節流的首選方法是使用 OutputStreamWriter、BufferedWriter 和 PrintWriter 類。

??? getRuntime()

????? 返回與當前 Java 應用程序相關的運行時對象。

?

??? halt(int status)

????? 強行終止目前正在運行的 Java 虛擬機。

??? load(String filename)

????? 加載作為動態庫的指定文件名。

??? loadLibrary(String libname)

????? 加載具有指定庫名的動態庫。

maxMemory()

????? 返回 Java 虛擬機試圖使用的最大內存量。

??? removeShutdownHook(Thread hook)

????? 取消注冊某個先前已注冊的虛擬機關閉掛鉤。

??? runFinalization()

????? 運行掛起 finalization 的所有對象的終止方法。

??? runFinalizersOnExit(value)

????? 已過時。 此方法本身具有不安全性。它可能對正在使用的對象調用終結方法,而其他線程正在操作這些對象,從而導致不正確的行為或死鎖。

??? totalMemory()

????? 返回 Java 虛擬機中的內存總量。

??? traceInstructions(on)

????? 啟用/禁用指令跟蹤。

??? traceMethodCalls(on)

????? 啟用/禁用方法調用跟蹤。

三、常見的應用

1、內存管理:

Java提供了無用單元自動收集機制。通過totalMemory()和freeMemory()方法可以知道對象的堆內存有多大,還剩多少。

Java會周期性的回收垃圾對象(未使用的對象),以便釋放內存空間。但是如果想先于收集器的下一次指定周期來收集廢棄的對象,可以通過調用gc()方法 來根據需要運行無用單元收集器。一個很好的試驗方法是先調用gc()方法,然后調用freeMemory()方法來查看基本的內存使用情況,接著執行代 碼,然后再次調用freeMemory()方法看看分配了多少內存。下面的程序演示了這個構想。

class MemoryDemo{

??? public static void main(String args[]){

??????? Runtime r = Runtime.getRuntime();

??????? long mem1,mem2;

??????? Integer someints[] = new Integer[1000];

??????? System.out.println("Total memory is :" + r.totalMemory());

??????? mem1 = r.freeMemory();

??????? System.out.println("Initial free is : " + mem1);

??????? r.gc();

??????? mem1 = r.freeMemory();

??????? System.out.println("Free memory after garbage collection : " + mem1);

??????? //allocate integers

??????? for(int i=0; i<1000; i++) someints[i] = new Integer(i);

?

??????? mem2 = r.freeMemory();

??????? System.out.println("Free memory after allocation : " + mem2);

??????? System.out.println("Memory used by allocation : " +(mem1-mem2));

?

??????? //discard Intergers

??????? for(int i=0; i<1000; i++) someints[i] = null;

??????? r.gc(); //request garbage collection

??????? mem2 = r.freeMemory();

??????? System.out.println("Free memory after collecting " + "discarded integers : " + mem2);

??? }

}

編譯后運行結果如下(不同的機器不同時間運行的結果也不一定一樣):

Total memory is :2031616

Initial free is : 1818488

Free memory after garbage collection : 1888808

Free memory after allocation : 1872224

Memory used by allocation : 16584

Free memory after collecting discarded integers : 1888808

?

2、執行其他程序

在安全的環境中,可以在多任務操作系統中使用Java去執行其他特別大的進程(也就是程序)。ecec()方法有幾種形式命名想要運行的程序和它的輸入參 數。ecec()方法返回一個Process對象,可以使用這個對象控制Java程序與新運行的進程進行交互。ecec()方法本質是依賴于環境。

下面的例子是使用ecec()方法啟動windows的記事本notepad。這個例子必須在Windows操作系統上運行。

?

class ExecDemo {

??? public static void main(String args[]){

??????? Runtime r = Runtime.getRuntime();

??????? Process p = null;

??????? try{

??????????? p = r.exec("notepad");

??????? } catch (Exception e) {

??????????? System.out.println("Error executing notepad.");

??????? }

??? }

}

?

ecec()還有其他幾種形式,例子中演示的是最常用的一種。ecec()方法返回Process對象后,在新程序開始運行后就可以使用Process的 方法了。可以用destory()方法殺死子進程,也可以使用waitFor()方法等待程序直到子程序結束,exitValue()方法返回子進程結束 時返回的值。如果沒有錯誤,將返回0,否則返回非0。下面是關于ecec()方法的例子的改進版本。例子被修改為等待,直到運行的進程退出:

class ExecDemoFini {

??? public static void main(String args[]){

??????? Runtime r = Runtime.getRuntime();

??????? Process p = null;

??????? try{

??????????? p = r.exec("notepad");

??????????? p.waitFor();

??????? } catch (Exception e) {

??????????? System.out.println("Error executing notepad.");

??????? }

??????? System.out.println("Notepad returned " + p.exitValue());

??? }

}

下面是運行的結果(當關閉記事本后,會接著運行程序,打印信息):

Notepad returned 0 www.87717.com

按任意鍵繼續. . .

?

當子進程正在運行時,可以對標準輸入輸出進行讀寫。getOutputStream()方法和getInPutStream()方法返回對子進程的標準輸入和輸出。

?

增加的內容:

使用Runtime.getRuntime().exec()方法可以在java程序里運行外部程序。
? 1. exec(String command)
? 2. exec(String command, String envp[], File dir)
? 3. exec(String cmd, String envp[])
? 4. exec(String cmdarray[])
? 5. exec(String cmdarray[], String envp[])
? 6. exec(String cmdarray[], String envp[], File dir)
一般的應用程序可以直接使用第一版本,當有環境變量傳遞的時候使用后面的版本。其中2和6版本可以傳遞一個目錄,標識當前目錄,因為有些程序是使用相對目錄的,所以就要使用這個版本。

cmd.exe /c start <FileName>
使用DOS命令(比如dir)時也要使用到調用。如果想與調用的程序進行交互,那么就要使用該方法的返回對象Process了,通過Process的 getInputStream(),getOutputStream()和getErrorStream()方法可以得到輸入輸出流,然后通過 InputStream可以得到程序對控制臺的輸出信息,通過OutputStream可以給程序輸入指令,這樣就達到了程序的交換功能。

用Java編寫應用時,有時需要在程序中調用另一個現成的可執行程序或系統命令,這時可以通過組合使用Java提供的Runtime類和Process類的方法實現。下面是一種比較典型的程序模式:

1 [轉載]Java?<wbr>RunTime類?<wbr>(轉載) ?? [轉載]Java?<wbr>RunTime類?<wbr>(轉載)
2 [轉載]Java?<wbr>RunTime類?<wbr>(轉載) ??Process?process? = ?Runtime.getRuntime().exec( " .\p.exe "
);
3
[轉載]Java?<wbr>RunTime類?<wbr>(轉載) ??process.waitfor();
4 [轉載]Java?<wbr>RunTime類?<wbr>(轉載) ?? [轉載]Java?<wbr>RunTime類?<wbr>(轉載)


在上面的程序中,第一行的“.\p.exe”是要執行的程序名,Runtime.getRuntime()返回當前應用程序的Runtime對象,該對象 的exec()方法指示Java虛擬機創建一個子進程執行指定的可執行程序,并返回與該子進程對應的Process對象實例。通過Process可以控制 該子進程的執行或獲取該子進程的信息。第二條語句的目的等待子進程完成再往下執行。
但在windows平臺上,如果處理不當,有時并不能得到預期的結果。下面是筆者在實際編程中總結的幾種需要注意的情況:
? 1、執行DOS的內部命令
? 如果要執行一條DOS內部命令,有兩種方法。一種方法是把命令解釋器包含在exec()的參數中。例如,執行dir命令,在NT上,可寫成exec("cmd.exe?? /c dir"),在windows95/98下,可寫成“command.exe /c dir”,其中參數“/c”表示命令執行后關閉DOS立即關閉窗口。另一種方法是,把內部命令放在一個批命令my_dir.bat文件中,在Java程序 中寫成exec("my_dir.bat")。如果僅僅寫成exec("dir"),Java虛擬機則會報運行時錯誤。前一種方法要保證程序的可移植性, 需要在程序中讀取運行的操作系統平臺,以調用不同的命令解釋器。后一種方法則不需要做更多的處理。
? 2、打開一個不可執行的文件
? 打開一個不可執行的文件,但該文件存在關聯的應用程序,則可以有兩種方式。以打開一個word文檔a.doc文件為例,Java中可以有以下兩種寫法:

1 [轉載]Java?<wbr>RunTime類?<wbr>(轉載) ??exec( " start?.\a.doc " );
2 [轉載]Java?<wbr>RunTime類?<wbr>(轉載) ??exec( " Files\Microsoft?Office\office\winword.exe?.\a.doc " );

? 顯然,前一種方法更為簡捷方便。
? 3、執行一個有標準輸出的DOS可執行程序
? 在Windows平臺上,運行被調用程序的DOS窗口在程序執行完畢后往往并不會自動關閉,從而導致Java應用程序阻塞在waitfor()語句。導致 該現象的一個可能的原因是,該可執行程序的標準輸出比較多,而運行窗口的標準輸出緩沖區不夠大。解決的辦法是,利用Java中Process類提供的方法 讓Java虛擬機截獲被調用程序的DOS運行窗口的標準輸出,在waitfor()命令之前讀出窗口的標準輸出緩沖區中的內容。一段典型的程序如下:

1 [轉載]Java?<wbr>RunTime類?<wbr>(轉載) ?? [轉載]Java?<wbr>RunTime類?<wbr>(轉載)
2
[轉載]Java?<wbr>RunTime類?<wbr>(轉載) ??String?s;
3 [轉載]Java?<wbr>RunTime類?<wbr>(轉載) ??Process?process? = ?Runtime.getRuntime().exec( " cmd?/c?dir?\windows "
);
4 [轉載]Java?<wbr>RunTime類?<wbr>(轉載) ??BufferedReader?bufferedReader? = ? new ?BufferedReader( new
?InputStreamReader(process.getInputStream());
5 [轉載]Java?<wbr>RunTime類?<wbr>(轉載) ?? while ((s = bufferedReader.readLine())? != ? null
)
6
[轉載]Java?<wbr>RunTime類?<wbr>(轉載) ??System.out.println(s);
7 [轉載]Java?<wbr>RunTime類?<wbr>(轉載) ??process.waitfor();

java Runtime類


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: a级毛片在线观看 | 狠狠综合 | 在线综合网 | 99热碰| 久久香蕉综合精品国产 | 伊人五月天综合 | 久久精品123| 婷婷在线五月 | 亚洲乱码国产乱码精品精98 | 久久精品六 | 久久国产精品久久久久久久久久 | 国产欧美在线不卡 | 日韩欧美一区二区三区久久 | 日韩精品久久不卡中文字幕 | 91精品久久久久亚洲国产 | 日本h片a毛片在线播放 | 成人看片黄a免费看视频 | 久久亚洲影院 | 九九热精品 | 99爱视频在线观看 | 天天操天天射天天色 | 亚洲欧美精品 | 成年女人免费毛片视频永久 | 国产成人18黄网站麻豆 | 日本精品久久久久中文字幕 1 | 精精国产www视频在线观看免费 | 青青青国产在线 | 婷婷涩 | 日本老年人精品久久中文字幕 | 久久久久久不卡 | 狠狠88综合久久久久综合网 | 亚洲欧美色鬼久久综合 | 色综合久久88色综合天天 | 四虎最新紧急入口4hu | 一区二区三区亚洲视频 | 久久久久久噜噜噜久久久精品 | 美女超爽久久久久网站 | 国产精品四虎视频一区 | 午夜精品福利在线 | 国内精品区一区二区三 | 日日夜夜操操操 |