我在Java中創建了一個Process
對象(如果這很重要,那麼程序是html tidy),通過stdin(Process.getOutputStream()
)提供一些數據並關閉流,但是當我調用Process.waitFor()
它永遠不會返回,因爲該進程不會退出。如何解決此問題而不致電Process.destroy()
?unix命令行程序在關閉stdin後不退出
-3
A
回答
-3
tidy
有可能在您退出前等待您使用輸出。如果您只是給程序提供大量數據並且它會爲您返回大量數據,則可能會發生這種情況。解決方案是在等待程序退出之前消耗輸出。這是我如何處理它(不是完整的代碼):
ProcessBuilder builder = new ProcessBuilder();
//-*snip*-
Process p = null;
Throwable error = null;
int returnCode = -1;
String output = null;
StringBuilder stdErr = new StringBuilder(200);
try{
p = builder.start();
try (Writer w = new BufferedWriter(new OutputStreamWriter(p.
getOutputStream()))){
w.write(html);
}
Process reference = p;
//read both outputs so tidy has no reason to wait
Thread errReader = new Thread(()->{
StringBuilderWriter writer = new StringBuilderWriter(stdErr);
try {
IOUtils.copy(reference.getErrorStream(), writer,
Charsets.UTF_8);
}
catch (IOException ex) {
//nom...
//An IOE that happens here will likely happen when reading
//stdout as well.
}
});
errReader.start();
//tidy might be waiting for us to consume output
output = IOUtils.toString(p.getInputStream());
returnCode = p.waitFor();
errReader.join();
}
+0
由於您想讓其他人發現問題,作爲重複問題的墊腳石,您可以通過刪除答案來清除負面答覆給您的問題來恢復某些答案。 – Andreas
+0
我可以,但答案可能對某人有用,並沒有那麼多的代表。我寧願幫助別人,也不願意擁有豐富的代表。 –
相關問題
- 1. 命令提示符不關閉正在運行已在最後一行「退出」
- 2. bash:退出程序執行,但在退出腳本後關閉程序
- 3. 後退線程不關閉退出應用程序
- 4. JVM在swing應用程序退出後不關閉
- 5. 退出電子應用程序後退出命令提示符
- 6. 在Windows關閉應用程序退出
- 7. 執行命令,然後退出
- 8. 執行命令並測試其退出狀態的Unix實用程序
- 9. 運行遠程命令後,ssh會話不會關閉
- 10. 最後一個窗口關閉後退出應用程序
- 11. 後退按鈕關閉應用程序
- 12. 在Twisted中關閉連接後退出Python程序
- 13. 在AppleScript中關閉窗口後退出應用程序
- 14. 從Python運行命令,然後關閉
- 15. 如何防止命令行窗口在出錯後關閉
- 16. 關於unix下運行獨立於命令行的程序
- 17. NSWindow關閉時退出應用程序
- 18. 退出時應用程序關閉Android
- 19. 從命令行關閉正在運行的程序
- 20. 如何運行命令並不等待應用程序退出?
- 21. 使用命令行的Unix程序
- 22. 執行遠程命令時出現SSH錯誤:「stdin:不是tty」
- 23. Java命令行退出命令?
- 24. 在C運行時與命令行程序交互(stdin/out)C
- 25. PopupWindow不關閉後退鍵
- 26. 爲Qt應用程序關閉STDIN
- 27. 如何關閉Unix上tar命令的輸出?
- 28. 退出命令行Python中
- 29. 從python命令行退出
- 30. 如何在退出Java程序時執行一組命令?
不,我只是無法找到這個答案別的地方,並認爲別人可能會從我所學到的東西中受益。 –
你們爲什麼不投票呢?我需要改述我的問題嗎? –
你真的需要一個相同答案的Unix版本嗎? – Andreas