簡體   English   中英

原子無阻塞寫入流套接字

[英]Atomic non-blocking writes to stream sockets

如果我write(byte[]) Channel支持的非阻塞SocketSocket.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM