[英]Atomic non-blocking writes to stream sockets
如果我write(byte[])
從 Channel
支持的非阻塞Socket
上從Socket.getOutputStream()
獲得的OutputStream
,並且write()
拋出IllegalBlockingModeException
,是否可以保證所有字節數組都已寫入或沒有寫入它是?
我在上面鏈接的文檔中找不到明確的答案。
請參見Channels.newOutputStream():
的Javadoc Channels.newOutputStream():
如果在基礎通道處於非阻塞模式下調用,則結果流的write方法將拋出IllegalBlockingModeException。
在嘗試任何寫入之前,將檢查該模式。 沒有其他實現會有意義。 如果可以寫作,那為什么還要例外呢?
簡短的答案:對於您的代碼的正確功能,不要假設或且不需要任何特定的行為。
長答案:沒有一種方法可以一概而論。 如果拋出IOException,則它可以在操作的任何時刻發生,並且之后應將流的狀態假定為“未定義”。
盡管IllegalBlockingException的javadoc聲明
Unchecked exception thrown when a blocking-mode-specific operation
is invoked upon a channel in the incorrect blocking mode
盡管該措辭暗示着在實際進行任何工作之前都要對其進行檢查(在實際執行之后檢查非法操作是沒有意義的),但問題是例外可能發生在一組相關對象的某處,因此無法知道在引發異常之前這些對象狀態是否已更改。
最明智的選擇是不嘗試操作,或者,如果無法避免,則不要對異常發生后的流/通道狀態做出特別的假設。
但是,我假定實際上不會寫入任何字節,因為該條件僅在實際寫入數據之前檢查才有意義-但這實際上是SocketChannelImpl中的一個實現細節。 您可以挖掘sun.nio.ch.SocketChannelImpl的源代碼(src.zip中未提供)來實際檢查實現; 但這只能為該特定實現提供確定的證據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.