ByteBuffer和部分写

时间:2016-01-29 09:27:08

标签: java nio

如果ByteBuffer部分写入,position会更新,下一个_channel.write来电将从最后一个位置恢复,是吗?

compact()没有必要吗?

private AsynchronousSocketChannel _channel;
private ByteBuffer _buffer;

final CompletionHandler<Integer, LogstashClientStream> _writeCompletionHandler = new CompletionHandler<Integer, LogstashClientStream>(){
    @Override
    public void completed(Integer sent, LogstashClientStream self) {
        if( _buffer.remaining() == 0 ){
            _buffer.clear();
            //...
        }                       
        else {
            // partial write
            self.send();
        }
    }

    @Override
    public void failed(Throwable exc, LogstashClientStream self) {
        //...
    }
};

private void send(){
    try{
        _channel.write( _buffer, this, _writeCompletionHandler);
    } catch(Throwable e){
        //...
    }
}

1 个答案:

答案 0 :(得分:1)

是的,它会恢复,不,compact()在这里没有必要。它主要用于在您再次调用write()之前从某些输入流填充其余缓冲区的情况。