java - ByteBuffer 和部分写入

标签 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){
        //...
    }
}

最佳答案

是的,它将恢复,并且不,这里不需要compact()。它主要在您想要在再次调用 write() 之前从某个输入流填充缓冲区的其余部分的情况下有用。

关于java - ByteBuffer 和部分写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35080952/

相关文章:

java - 如何使用 gradle 下载/使用已发布的工件

java - 如何在没有命名空间的情况下编码?

java - Channel中如何高效转换字符编码?

java - 这个路径在java nio中的位置

java - 如何使用 Java FileChooser 创建临时文件?

java - 运行 mvn checkstyle :checkstyle 时出错

java - android studio setcontentview 与 oncreate

java - 如何从java读取.ptn文件

java - ReadableByteChannel.read()为什么会出现IOExceptions

java - 当键集大小为 0 时,选择器的默认行为是什么?