[英]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.