繁体   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