一眼看過去相信大家都知道用Runtime.getRuntime().exec來調(diào)用,我的需求就是: ![]() ![]() ![]() ![]() ![]() Process process = Runtime.getRuntime().exec(cmds); ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() } ![]() ![]() ![]() ![]() ![]() 竟然碰到這樣的問題,徹底暈,開始google,竟然只查到一篇和我這同樣的問題,更郁悶的是那個(gè)帖子最后樓主寫了一句“問題解決了”,但沒寫是怎么解決的,郁悶S。 只好自己開始嘗試各種辦法,上網(wǎng)抓人到處問,最后在自己不斷的嘗試下終于是出現(xiàn)了轉(zhuǎn)機(jī),在我的N+1次嘗試的時(shí)候我改為只讀取process的ErrorStream,然后執(zhí)行,暈,OK了,在導(dǎo)出成功的情況下沒有問題,但在導(dǎo)出有錯(cuò)誤的時(shí)候(像sid不對(duì),用戶名錯(cuò)誤,數(shù)據(jù)庫沒啟動(dòng)等)進(jìn)程還是被掛S,但只要導(dǎo)出成功沒問題,導(dǎo)出有錯(cuò)誤的問題是很好處理的,OK,最后試驗(yàn)的代碼改為這樣: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 這樣反而可以了,說明什么呢,說明在執(zhí)行oracle的exp時(shí),出現(xiàn)了一個(gè)很怪的現(xiàn)象,就是exp在console輸出的信息沒有被放入InputStream,反而是放到了ErrorStream中(即使正確的情況也是),這就導(dǎo)致了按照正常的情況去寫這段代碼的話反而會(huì)出問題。 擔(dān)心以后再次碰到這樣的問題,備忘一下.... ![]() 評(píng)論正如你所說的,處理Process的時(shí)候要注意及時(shí)讀取子進(jìn)程的輸出流,不然可能導(dǎo)致子進(jìn)程堵塞,甚至死鎖。
如果我是你,我會(huì)這么來排除bug。 1,把對(duì)InputStream的處理放到一個(gè)單獨(dú)Thread里面。 2,用ProcessBuilder的redirectErrorStream來合并OutputStream和ErrorStream。注意子進(jìn)程的InputStream對(duì)應(yīng)父進(jìn)程的OutStream。如果不合并這兩個(gè)流的話則必須并行排空它們,順序的排空會(huì)導(dǎo)致思索。 建議你好好看看5.0的API和JLS。 回復(fù) |
|