Tao
Tao

bytebuffer类clear方法 VS compact方法

buffer.compact() 和 buffer.clear() 是 Java NIO 中缓冲区操作的两个不同方法,它们的作用和行为有一些区别。

buffer.compact(): 这个方法用于重新组织缓冲区中的数据。它会将未读取的数据移到缓冲区的开头,同时更新缓冲区的位置(position)和界限(limit),以便后续的写入操作。这样可以保留未读取的数据,并为后续的写入操作提供空间。

buffer.clear(): 这个方法用于清空缓冲区并准备进行新的写入操作。它会将缓冲区的位置(position)设置为 0,将界限(limit)设置为缓冲区的容量,表示整个缓冲区都可用于写入数据。调用 buffer.clear() 方法后,缓冲区中的数据仍然存在,但它们的内容可以被新的写入操作所覆盖。

buffer.compact() 会保留未读取的数据,并将其移动到缓冲区的开头,以便后续的写入操作。它适用于需要在读取操作后继续写入的场景。 buffer.clear() 则完全清空缓冲区,并准备进行全新的写入操作。它适用于不需要保留缓冲区中的数据,而是要进行全新写入的场景。

buffer.compact()是Java NIO中的一个方法,用于在读取数据后重新组织缓冲区的内容。

当使用缓冲区进行读取操作后,通常需要将读取的数据从缓冲区中移出,以便为后续的写入操作腾出空间。但是调用 buffer.clear()方法会清空整个缓冲区,而buffer.compact()方法则会更加智能地处理。

buffer.compact()方法的作用是将未读取的数据移至缓冲区的开头,并将缓冲区的位置(position设置为移动后未读取数据的末尾。这样,可以在保留未读取数据的同时,为后续的写入操作提供空间。

具体来说,buffer.compact() 方法会按照以下步骤执行:

  • 将缓冲区中的未读取数据向缓冲区的开头移动。
  • 将缓冲区的位置(position)设置为移动后未读取数据的末尾。 将缓冲区的界限(limit)设置为缓冲区的容量,以准备进行写入操作。
  • 通过使用 buffer.compact() 方法,可以在不清空整个缓冲区的情况下,为后续的写入操作提供空间,并保留未读取的数据供进一步处理。

java

import java.nio.CharBuffer;
public class BufferCompactDemo {
    public static void main(String[] args) {
        CharBuffer buffer = CharBuffer.allocate(10);
        buffer.put('H');
        buffer.put('e');
        buffer.put('l');
        buffer.put('l');
        buffer.put('o');
        buffer.flip();
        System.out.println("Before compact - position: " + buffer.position() + ", limit: " + buffer.limit());
        buffer.compact();
        System.out.println("After compact - position: " + buffer.position() + ", limit: " + buffer.limit());
        buffer.put('W');
        buffer.put('o');
        buffer.put('r');
        buffer.put('l');
        buffer.put('d');
        buffer.flip();
        while (buffer.hasRemaining()) {
            System.out.print(buffer.get());
        }
    }
}

输出结果

shell

Before compact - position: 0, limit: 5
After compact - position: 5, limit: 10
HelloWorld

buffer.clear()是Java NIO中的一个方法,用于清空缓冲区并准备进行新的写入操作。 当调用 buffer.clear()方法时,它会执行以下操作:

  • 将缓冲区的位置(position)设置为0,表示写入操作将从缓冲区的开头开始。
  • 将缓冲区的界限(limit)设置为缓冲区的容量,表示整个缓冲区都可用于写入数据。

这样,buffer.clear()方法会重置缓冲区的状态,使其准备好接收新的数据写入。

需要注意的是,buffer.clear()方法并不会真正清空缓冲区中的数据,而是通过重置位置和界限来覆盖已存在的数据。这意味着在调用 buffer.clear()方法后,缓冲区中原有的数据仍然存在,但它们的内容可以被新的写入操作所覆盖。

因此,如果需要读取缓冲区中的数据,应在调用 buffer.clear()方法之前先处理已存在的数据,或者使用buffer.flip()方法切换到读取模式,并在读取完数据后再调用buffer.clear()方法进行写入操作的准备。

java

import java.nio.CharBuffer;
public class BufferClearDemo {
    public static void main(String[] args) {
        CharBuffer buffer = CharBuffer.allocate(10);
        buffer.put('H');
        buffer.put('e');
        buffer.put('l');
        buffer.put('l');
        buffer.put('o');
        buffer.flip();
        while (buffer.hasRemaining()) {
            System.out.print(buffer.get());
        }
        System.out.println();
        buffer.clear();
        System.out.println("After clear - position: " + buffer.position() + ", limit: " + buffer.limit());
        buffer.put('W');
        buffer.put('o');
        buffer.put('r');
        buffer.put('l');
        buffer.put('d');
        buffer.flip();
        while (buffer.hasRemaining()) {
            System.out.print(buffer.get());
        }
    }
}

输出结果

shell

Hello
After clear - position: 0, limit: 10
World

相关内容