Java 中的進程輸入/輸出流通訊
在Java 中,從正在運行的進程存取輸入或輸出流對於命令執行和執行至關重要。數據交換。然而,有效管理這些流時可能會出現陷阱。
問題亮點
您詢問為什麼您的程式碼範例會遇到損壞的管道錯誤以及為什麼後續輸出流無法運行第一次閱讀後。問題在於程式碼從 shell 進程操作輸入和輸出流的方法。
解
要解決此問題,請考慮以下步驟:
- 使用ProcessBuilder: 將初始化“process”變數的程式碼替換為ProcessBuilder,它可以更好地控制流程處理。使用“ProcessBuilder.redirectErrorStream(true)”將標準輸出和錯誤重新導向到單一流。
- 打破循環習慣:從讀取器(stdout)讀取的循環僅退出當該過程完成時。這意味著如果未提供額外的輸入,它將掛起。
- 引入指令分隔符號:要可靠地擷取多個指令的輸出,請考慮採用「魔術字串」技術。引入一個唯一的字串(例如“--EOF--”)來標記每個指令輸出的結尾。
- 調整輸入寫入: 若要傳送帶有分隔符號的指令,請附加指令為「&& echo --EOF--」。如果輸入“exit”,則發送“exit”。
說明
這些修改解決了損壞的管道錯誤並允許執行多個命令一致的輸出檢索。 “魔術字串”分隔符號確保讀取操作始終以分隔符號終止,從而防止掛起。
儘管進行了這些調整,但仍存在一些限制:
使用者輸入提示命令可能會導致程式掛起。 - 換行符終止輸出的假設可能會引入問題。
- 「退出」處理已得到改進,但其他特殊輸入情況可能需要額外考慮。
-
透過合併這些建議,您的程式碼可以有效地管理來自一個正在運行的進程,為定期執行命令的穩定可靠的排程任務鋪平了道路。
以上是如何可靠地管理 Java 進程的輸入/輸出流以避免管道損壞並確保輸出一致?的詳細內容。更多資訊請關注PHP中文網其他相關文章!