簡體   English   中英

如何在Java中停止等待輸入的Windows批處理?

[英]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.batpause結尾,並且使p仍然掛在那里等待按鍵被按下。 結果,最終reader.readLine()將被阻止並且永遠不會返回。

不幸的是, simple.batsimple.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM