Java調用Windows cmd命令 阻塞問題詳解

開發中遇到最大的難題就是調用cvs命令更新和取log到文件
Java調用cmd命令有兩種方法:
1. 	java.lang.ProcessBuilder builder = new ProcessBuilder(cmdArray);
	builder.directory(new File(workdirectory));
	Process process = builder.start();
	
2. 	java.lang.Runtime.getRuntime().exec("cmd");
	OutputStream os = logProcess.getOutputStream();
	os.write(command.getBytes());
	os.flush();


問題1: cvs log輸出重定向。

第一種方法看起來很美,無奈不支持io重定向,於是無法用來調用cvs log命令並輸出到文件
第二種方法是調用windows的cmd程序,用起來很麻煩,包括目錄定位都需要人肉使用”cd“指令,但是優點是完全支持cmd下的各種指令,
包括io重定向,所以可以解決cvs log輸出到文件的問題。


解決辦法:使用方法2.


問題2:cvs log和cvs update輸出流內容(標準輸出、標準錯誤輸出)太多,不及時讀出會導致緩衝區滿,進程阻塞。
第一種方法需要將標準輸出和標準錯誤輸出同時讀出,因爲任何一個緩衝區滿都回導致阻塞,故需要用多線程同時去兼顧兩個輸出流。
第二種方法因爲可以使用輸出重定向,不需要再care標準輸出,故只需要在調用命令後讀取標準錯誤輸出即可。
需要注意的是第二種方法在讀取標準錯誤輸出前需要先將指令輸入流close掉,這個我仍不清楚什麼原因,可能類似於”ctrl+z“的作用。


解決辦法:cvs update不需要輸出重定向,故使用方法1調用,cvs log用方法2。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章