一眼看過(guò)去相信大家都知道用Runtime.getRuntime().exec來(lái)調(diào)用,我的需求就是:
調(diào)用Oracle EXP命令完成備份,并返回生成的備份文件名,這個(gè)備份文件會(huì)很快在其他的地方被使用。
采用Runtime.getRuntime().exec我們都知道,需要處理它的InputStream,以避免出現(xiàn)執(zhí)行的命令輸出的信息過(guò)多使得進(jìn)程被堵死,OK,按照這樣的方法,開(kāi)寫(xiě):





Process process = Runtime.getRuntime().exec(cmds);










}






竟然碰到這樣的問(wèn)題,徹底暈,開(kāi)始google,竟然只查到一篇和我這同樣的問(wèn)題,更郁悶的是那個(gè)帖子最后樓主寫(xiě)了一句“問(wèn)題解決了”,但沒(méi)寫(xiě)是怎么解決的,郁悶S。
只好自己開(kāi)始嘗試各種辦法,上網(wǎng)抓人到處問(wèn),最后在自己不斷的嘗試下終于是出現(xiàn)了轉(zhuǎn)機(jī),在我的N+1次嘗試的時(shí)候我改為只讀取process的ErrorStream,然后執(zhí)行,暈,OK了,在導(dǎo)出成功的情況下沒(méi)有問(wèn)題,但在導(dǎo)出有錯(cuò)誤的時(shí)候(像sid不對(duì),用戶(hù)名錯(cuò)誤,數(shù)據(jù)庫(kù)沒(méi)啟動(dòng)等)進(jìn)程還是被掛S,但只要導(dǎo)出成功沒(méi)問(wèn)題,導(dǎo)出有錯(cuò)誤的問(wèn)題是很好處理的,OK,最后試驗(yàn)的代碼改為這樣:































這樣反而可以了,說(shuō)明什么呢,說(shuō)明在執(zhí)行oracle的exp時(shí),出現(xiàn)了一個(gè)很怪的現(xiàn)象,就是exp在console輸出的信息沒(méi)有被放入InputStream,反而是放到了ErrorStream中(即使正確的情況也是),這就導(dǎo)致了按照正常的情況去寫(xiě)這段代碼的話反而會(huì)出問(wèn)題。
擔(dān)心以后再次碰到這樣的問(wèn)題,備忘一下....
評(píng)論
正如你所說(shuō)的,處理Process的時(shí)候要注意及時(shí)讀取子進(jìn)程的輸出流,不然可能導(dǎo)致子進(jìn)程堵塞,甚至死鎖。
如果我是你,我會(huì)這么來(lái)排除bug。
1,把對(duì)InputStream的處理放到一個(gè)單獨(dú)Thread里面。
2,用ProcessBuilder的redirectErrorStream來(lái)合并OutputStream和ErrorStream。注意子進(jìn)程的InputStream對(duì)應(yīng)父進(jìn)程的OutStream。如果不合并這兩個(gè)流的話則必須并行排空它們,順序的排空會(huì)導(dǎo)致思索。
建議你好好看看5.0的API和JLS。 回復(fù) 更多評(píng)論
如果我是你,我會(huì)這么來(lái)排除bug。
1,把對(duì)InputStream的處理放到一個(gè)單獨(dú)Thread里面。
2,用ProcessBuilder的redirectErrorStream來(lái)合并OutputStream和ErrorStream。注意子進(jìn)程的InputStream對(duì)應(yīng)父進(jìn)程的OutStream。如果不合并這兩個(gè)流的話則必須并行排空它們,順序的排空會(huì)導(dǎo)致思索。
建議你好好看看5.0的API和JLS。 回復(fù) 更多評(píng)論
我也遇到你這樣的問(wèn)題,不過(guò)我還是用getInputStream()才可以,用getErrorStream我也試了一下,只能倒入300條數(shù)據(jù)就卡住了. 回復(fù) 更多評(píng)論