我搜索了高和低,但無法找到一個明確的,最新的答案我有關NIO的問題。InputStream到渠道的選擇器
有什麼辦法可以將InputStream
轉換成Channel
,我可以使用Selector
?看起來像Channels.newChannel()
是做轉換的唯一方法,但不提供AbstractSelectableChannel
的實例,這實際上是我所需要的。
更具體地說,我想從stdout
和stderr
中讀取子流程的流,而不是每個流創建一個線程,看起來這是在純Java中執行它的唯一方法。由於這些流正在使用管道來回傳遞I/O,所以我很驚訝.newChannel
未返回Pipe.SourceChannel
,它是AbstractSelectableChannel
的一個子類。
我正在使用Java 7(但如果新功能在8中可用,我仍然很樂意回答)。
編輯:我也嘗試過鑄造的.newChannel()
結果爲可選擇的頻道無濟於事 - 它不是一個可選擇通道。
不幸的是,因爲我的第三方子'stderr'穿插隨機分爲'stdout'我無法合併流(它們沒有被換行分隔,因爲人們希望)。 – Dan
然後你被困在額外的線程中。 – EJP
您可以在沒有額外線程的情況下執行此操作,但它需要一個輪詢循環來分別將'stdout'和'stderr'流捕獲到不同的地方(例如'StringBuilder's)。使用'select'會更好,但看起來不可能做到這一點。 :( –