2016-01-29 3 views
1

Если ByteBuffer написано частично, обновляется position, и следующий звонок _channel.write возобновится с последней позиции, да?ByteBuffer и частичная запись

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){ 
     //... 
    } 
} 
+0

В чем проблема? Работает ли код или нет? Если нет, то что работает не так, как ожидалось? – Gavriel

ответ

1

Да, это будет возобновлено, и нет, compact() здесь нет необходимости. Это полезно, главным образом, в случаях, когда вы хотите заполнить остальную часть буфера из некоторого входного потока перед повторным вызовом write().

Смежные вопросы