Java中的交互過程存在問題。我有線程來讀取STDOUT和STDERR以及一個線程來處理進程的輸入。但是,在進程終止之前,STDOUT流中沒有可用的數據。然後是整個輸出打印一次。Java exec - 交互過程的輸出一直保持到過程終止
DBG | Pipe action-STDERR started
DBG | Pipe action-STDIN started
DBG | Pipe action-STDOUT started
STDIN | Try to put some input.
STDIN | I cannot see any output.
STDIN | Nevertheless the interaction works.
STDIN | It works on background.
STDIN | Let's terminate the process to see the truth.
STDIN | quit
STDOUT | Enter some text, please: The text is 'Try to put some input.'
STDOUT | Enter some text, please: The text is 'I cannot see any output.'
STDOUT | Enter some text, please: The text is 'Nevertheless the'
STDOUT | Enter some text, please: The text is 'interaction works.'
STDOUT | Enter some text, please: The text is 'It works on background.'
STDOUT | Enter some text, please: The text is 'Let's terminate the process to see the truth.'
STDOUT | Enter some text, please: The text is 'quit'
STDOUT | Bye!
DBG | Trying to kill thread action-STDOUT
DBG | Trying to kill thread action-STDERR
DBG | Trying to kill thread action-STDIN
DBG | Pipe action-STDERR finished
DBG | Finished
DBG | Pipe action-STDIN finished
DBG | Pipe action-STDOUT finished
以STDOUT作爲前綴的行是由進程寫入的行。以STDIN作爲前綴的行是我寫的行。以DBG爲前綴的行是被測試的Java程序寫入的行作爲調試信息。讓我們嘗試在系統控制檯中執行相同的過程。
這種行爲完全符合我的期望。我被要求輸入一些信息。我這樣做,並得到答案。
我很驚訝,我發現在網上的幾個帖子包括Stackoverflow,但沒有任何答案標記爲可接受的解決方案。 (例如Problem reading InputStream from Java Process。)似乎Java開發人員從未處理交互式進程的執行。奇怪的是,當進程正在運行時,非交互式進程(如ping)的輸出順序出現。沒有任何問題。但是當進程等待用戶輸入時,輸出會以某種方式被阻止。
寫入的其他進程(「服務器」)是什麼,並且它確保每次都刷新其stdout? –
可能不是,但是這個過程在這個級別是黑盒子。不管它是否沖洗它的輸出都不重要,因爲我不能影響它。我必須解決Java代碼中的問題。 –