原子非阻塞写入流套接字

时间:2014-10-02 14:07:23

标签: java sockets nio nonblocking

如果我write(byte[]) to an OutputStream获得了由Socket支持的非阻止Channel write()以及{{1}}投注from Socket.getOutputStream(),那么它是IllegalBlockingModeException保证所有字节数组都被写入或者没有写入?

我在上面链接的文档中找不到明确的答案。

2 个答案:

答案 0 :(得分:0)

请参阅Channels.newOutputStream():

的Javadoc
  

如果在底层通道处于非阻塞模式时调用,结果流的写入方法将抛出IllegalBlockingModeException。

在尝试任何写入之前检查模式。没有其他实施是有道理的。如果可以写作,为什么会有例外呢?

答案 1 :(得分:-1)

简短回答:不要为代码的正确功能假设或不需要任何特定行为。

答案很长:没有办法一般地说出来;如果抛出IOException,它可以在操作的任何时刻发生,并且流的状态应该假设为" undefined"之后。

尽管有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中未提供)的源代码来实际检查实现;但这只能为这一具体实施提供明确的证据。