[英]How to stop an input-waiting Windows batch process in Java?
我有一個Windows批處理文件simple.bat
,它在stdin中產生一些輸出,並以pause
結尾。 我想運行此批處理文件,然后在我的Java代碼中處理輸出。
// create a Java process with simple.bat
Process p = Runtime.getRuntime().exec("cmd /c simple.bat");
// get the output from the process p
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringBuilder builder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line);
builder.append(System.getProperty("line.separator"));
}
String result = builder.toString();
上面的代碼的問題是simple.bat
以pause
結尾,並且使p
仍然掛在那里等待按鍵被按下。 結果,最終reader.readLine()
將被阻止並且永遠不會返回。
不幸的是, simple.bat
是simple.bat
傳遞給我的。 我無法刪除pause
線。
我可以添加
Thread.sleep(1000);
p.destroy();
在exec("cmd /c start simple.bat")
行之后終止進程p
然后再處理其輸出。 如果批處理文件在慢速計算機上運行怎么辦? 我正在尋求建議,是否有比異步停止該過程更好的方法。 非常感謝你!!
如果您的腳本不需要向其發送任何輸入,並且您以cmd /c simple.bat
身份運行它,那么最簡單的方法是關閉進程的標准輸入:
p.getOutputStream().close();
我自己進行了一次快速測試,這消除了pause
並讓腳本終止。 您當然會有多余的一行。 Press any key to continue . . .
Press any key to continue . . .
在您的輸出中,但我想您可以解決。
銷毀該過程可能是正確的,作為一個后備。 您將不得不考慮如何使您的應用程序失敗:中止比掛起過程更糟嗎? 用戶實際上會注意到哪些故障?
在大多數情況下,上述兩種情況都是不希望的。
如果您知道已經暫停(基於最后一個readline()
),則可以實際寫入該進程。 這可以通過獲取輸出流Process.getOutputStream()
來完成。 我無法對此進行測試,但是正常情況下,暫停也會對寫入此流的字符產生反應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.