ByteBuffer 类的 rewind() 和 clear() 有啥区别?

Posted

技术标签:

【中文标题】ByteBuffer 类的 rewind() 和 clear() 有啥区别?【英文标题】:What is the difference between rewind() and clear() of class ByteBuffer?ByteBuffer 类的 rewind() 和 clear() 有什么区别? 【发布时间】:2014-08-09 14:50:32 【问题描述】:

请注意,在 JDK 文档中,rewind()clear() 在“清理”ByteBuffer 时看起来很相似。其实旧数据是存在的,而且rewind()应该在channel-write或者get操作之前使用,clear()对应channel-read或者put操作。

我对给定的描述感到困惑。这些地球上的对应物有什么区别?

【问题讨论】:

【参考方案1】:

不同之处在于clear 将限制重置为容量,因此为要写入(和由您读取)的其他数据准备缓冲区,而rewind 不会对限制做任何事情,因此您的数据可以再读一遍。

【讨论】:

你的意思是倒带不是缓冲区清理,只是准备缓冲区读取操作? 这两种方法实际上都不会清除缓冲区内的数据。只有部分指标发生变化。【参考方案2】:

1) 这里是 clear() 方法:

public final Buffer clear() 
    position = 0;
    limit = capacity;
    mark = -1;
    return this;

clear() 方法重置缓冲区 为空状态。它不会更改缓冲区的任何数据元素,而只是设置 限制容量和位置回到0

2) 这里是 rewind() 方法:

 public final Buffer rewind() 
    position = 0;
    mark = -1;
    return this;

您可以使用 rewind( ) 返回并重新读取缓冲区中的数据 被翻转。如您所见:它不会改变限制。有时,从缓冲区读取数据后,您可能想再次读取它,rewind() 是您的正确选择。

【讨论】:

以上是关于ByteBuffer 类的 rewind() 和 clear() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

java.nio.ByteBuffer 以及flip,clear及rewind区别

ByteBuffer详解

Fortran语言的REWIND和BACKSPACE 函数

buffer之 flip与rewind

fflush(stdin)和rewind(stdin)

C语言文件指针定位函数fseek与rewind有何区别?