如果我write(byte[])
to an OutputStream
获得了由Socket
支持的非阻止Channel
write()
以及{{1}}投注from Socket.getOutputStream()
,那么它是IllegalBlockingModeException
保证所有字节数组都被写入或者没有写入?
我在上面链接的文档中找不到明确的答案。
答案 0 :(得分:0)
请参阅Channels.newOutputStream():
如果在底层通道处于非阻塞模式时调用,结果流的写入方法将抛出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中未提供)的源代码来实际检查实现;但这只能为这一具体实施提供明确的证据。