呵呵。。 view plaincopy to clipboardprint? 上面的代碼比較簡單: 其中分為幾個步驟: 1.獲取當(dāng)前系統(tǒng)的運(yùn)行環(huán)境。 2.在當(dāng)前系統(tǒng)執(zhí)行系統(tǒng)命令。 3.執(zhí)行后,獲取其執(zhí)行后的數(shù)據(jù)。 4.輸出數(shù)據(jù)。 5.結(jié)束。 ======================================================================== 首先學(xué)習(xí)下:Process類。 簡單地測試一下: 調(diào)用Javac命令,并查看執(zhí)行命令的返回值,并輸出到控制臺上去。
呵呵,從上面,我們可以知道,并不能得到我們想要的結(jié)果。至于什么原因呢。 下面一段話直接引用別人的:(它比較詳細(xì)地講述了出錯的原因) 這里主要的問題就是錯誤的調(diào)用了exitValue來取得外部命令的返回值(呵呵,這個錯誤我也曾經(jīng)犯過),因?yàn)?exitValue這個方法是不阻塞的,程序在調(diào)用這個方法時外部命令并沒有返回所以造成了異常的出現(xiàn),這里是由另外的方法來等待外部命令執(zhí)行完畢的,就是waitFor方法,這個方法會一直阻塞直到外部命令執(zhí)行結(jié)束,然后返回外部命令執(zhí)行的結(jié)果,作者在這里一頓批評設(shè)計(jì)者的思路有問題,呵呵,反正我是無所謂阿,能用就可以拉。但是作者在這里有一個說明,就是exitValue也是有好多用途的。因?yàn)楫?dāng)你在一個Process上調(diào)用waitFor方法時,當(dāng)前線程是阻塞的,如果外部命令無法執(zhí)行結(jié)束,那么你的線程就會一直阻塞下去,這種意外會影響我們程序的執(zhí)行。所以在我們不能判斷外部命令什么時候執(zhí)行完畢而我們的程序還需要繼續(xù)執(zhí)行的情況下,我們就應(yīng)該循環(huán)的使用exitValue來取得外部命令的返回狀態(tài),并在外部命令返回時作出相應(yīng)的處理。 那么好,既然出錯了,當(dāng)然要修改啦: 改為如下:
得到上面這個結(jié)果是我意想不到的。因?yàn)樵赪indows下執(zhí)行,會一直阻塞在那里。 卻我在Ubuntu里面執(zhí)行時,卻在編譯時卻卻不過, 拋出了這樣的異常: Exec_Javac.java:7: unreported exception java.lang.InterruptedException; must be caught or declared to be thrown 后來加上InterrupedException才可以執(zhí)行??梢允黔h(huán)境上的不同。雖然是輸出了結(jié)果,但是因?yàn)楫惓V袛嗖泡敵龅慕Y(jié)果。也不是我想要的結(jié)果。這個又是為什么呢? 以下又是引用別人的話: JDK文檔中對此有如此的解釋:因?yàn)楸镜氐南到y(tǒng)對標(biāo)準(zhǔn)輸入和輸出所提供的緩沖池有效,所以錯誤的對標(biāo)準(zhǔn)輸出快速的寫入和從標(biāo)準(zhǔn)輸入快速的讀入都有可能造成子進(jìn)程的鎖,甚至死鎖。 文檔引述完了,作者又開始批評了,他說JDK僅僅說明為什么問題會發(fā)生,卻并沒有說明這個問題怎么解決,這的確是個問題哈。緊接著作者說出自己的做法,就是在執(zhí)行完外部命令后我們要控制好Process的所有輸入和輸出(視情況而定),在這個例子里邊因?yàn)檎{(diào)用的是 Javac,而他在沒有參數(shù)的情況下會將提示信息輸出到標(biāo)準(zhǔn)出錯,所以在下面的程序中我們要對此進(jìn)行處理。 呵呵。。不是想要的結(jié)果。當(dāng)然還是得改進(jìn)啦。 代碼如下:
哎,不管怎么說還是出來了結(jié)果,作者作了一下總結(jié),就是說,為了處理好外部命令大量輸出的情況,你要確保你的程序處理好外部命令所需要的輸入或者輸出。 其實(shí)呀。還有其他,下篇再講啦。 這會總算得到結(jié)果啦。不過在ubuntu里面跟在windows里面得到的結(jié)果有點(diǎn)不一樣。 大家注意下。 |
|