While the implementations for blocking and non-blocking writes are
very similar they have been split into separate methods to allow
sub-classes to override them individually. NIO2, for example,
overrides the non-blocking write but not the blocking write.