添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在学习Java NIO中看到关于Buffer的部分时提到 bytebuffer调用clear()方法不会真正的删除掉buffer中的数据 ,只是把position移动到最前面,同时把limit调整为capacity。源码:

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

官方概述:This method does not actually erase the data in the buffer, but it * is named as if it did because it will most often be used in situations * in which that might as well be the caseClears this buffer. The position is set to zero, the limit is set to * the capacity, and the mark is discarded. *

关键一句就是 This method does not actually erase the data in the buffer,它并没有清除数据,只是把光标设置第一个位置上,限制变成容量大小。

调用clear()方法:position将被设回0,limit设置成capacity,换句话说,Buffer看起来被清空了,其实Buffer中的数据并未被清除,只是这些标记告诉我们可以从哪里开始往Buffer里写数据。

如果Buffer中有一些未读的数据,调用clear()方法,数据将“被遗忘”,意味着不再有任何标记会告诉你哪些数据被读过,哪些还没有。

如果Buffer中仍有未读的数据,且后续还需要这些数据,但是此时想要先写些数据,那么使用 compact() 方法。compact()方法将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样,设置成capacity。现在Buffer准备好写数据了,但是不会覆盖未读的数据。

另有文章:

  1. https://blog.csdn.net/pfnie/article/details/52829549
  2. https://blog.csdn.net/qq_22701869/article/details/107091427
在学习Java NIO中看到关于Buffer的部分时提到bytebuffer调用clear()方法不会真正的删除掉buffer中的数据,只是把position移动到最前面,同时把limit调整为capacity。源码:public final Buffer clear() { position = 0; limit = capacity; mark = -1; return this; }官方概述:This method does 我在网上搜索了很多,大部分都是说针对mark、limit、capacity、position 标志量来解释的,ok!我想补充一下,从如何应用的方面来说明其含义。  1、有一个文件共有20个字符:      abcdefghijklmnopqrst  2、我们声明一个char[15] buffer 大小的字符数组  Java代码    for(readChar(buffer...
在学习JavaNIO中看到关于Buffer的部分时提到buffer调用clear()方法不会真正的删除掉buffer中的数据,只是把position移动到最前面,同时把limit调整为capacity,忽然想到,如果不是真的删除掉buffer中的数据,那么如果之前写入buffer中五个字符: CharBuffer buf = CharBuffer.allocate(48); buf.put(n...
ByteBuffer继承于Buffer。 使用一个字节数组作为缓冲器。读取的数据和发送的数据会放入字节数组hb中。当数组达到一定大小,一次性写入通道或者读取。避免每次操作都要进行读写操作。 public abstract class ByteBuffer extends Buffer implements Comparable<ByteBuffer> final by...
private ByteBuffer byteBuffer = ByteBuffer.allocate(300);//注意这里根据自己的需要预估大小 private byte b0d = (byte)0x0d,b0a = (byte)0x0a;//回车、换行字节,可以不需要我这样而直接写在代码里 private void doWithBytes 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区: 使用缓冲区有这么两个好处: 1、减少实际的物理读写次数 2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数 举个简单的例子,比如A地有1w块砖要搬到B地 public static void main(String[] args) { try (FileChannel channel = new FileInputStream("data.txt").getChannel()){ // 定义缓冲区 allocate分配大小 ByteBuffer buffer = ByteBuffer.allocate(10); while(tr
概述:直接看clear()官方介绍Clears this buffer. The position is set to zero, the limit is set to the capacity, and the mark is discarded. Invoke this method before using a sequence of channel-read or put opera...
// Invariants: mark <= position <= limit <= capacity private int mark = -1;//标记位置,reset时需要 private int position = 0;//当前读取 private int limit;//...
`ByteBuffer.compact()`方法和`ByteBuffer.clear()`方法都是Java NIO中ByteBuffer类的方法,它们的作用不同。 `ByteBuffer.clear()`方法会将缓冲区的位置(position)设置为0,将界限(limit)设置成容量(capacity),从而清空缓冲区中的内容。但是,这些数据并没有真正地被清除,仍然存在于缓冲区中,只是处于“被遗忘”状态,可以被重新写入。 `ByteBuffer.compact()`方法会将缓冲区中的未读数据移动到缓冲区的起始位置,然后将位置(position)设置为未读数据的长度,将界限(limit)设置成容量(capacity)。这样,缓冲区中未读的数据就被移到了缓冲区的起始位置,已读过的数据则被覆盖掉或者被清除,缓冲区可以继续写入新的数据。 因此,`clear()`方法适用于需要清空缓冲区的情况,而`compact()`方法适用于需要在已读取数据的基础上继续写入数据的情况。