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() 则完全清空缓冲区,并准备进行全新的写入操作。它适用于不需要保留缓冲区中的数据,而是要进行全新写入的场景。
compact源码解析
buffer.compact()是Java NIO中的一个方法,用于在读取数据后重新组织缓冲区的内容。
当使用缓冲区进行读取操作后,通常需要将读取的数据从缓冲区中移出,以便为后续的写入操作腾出空间。但是调用 buffer.clear()方法会清空整个缓冲区,而buffer.compact()方法则会更加智能地处理。
buffer.compact()方法的作用是将未读取的数据移至缓冲区的开头,并将缓冲区的位置(position设置为移动后未读取数据的末尾。这样,可以在保留未读取数据的同时,为后续的写入操作提供空间。
具体来说,buffer.compact() 方法会按照以下步骤执行:
- 将缓冲区中的未读取数据向缓冲区的开头移动。
- 将缓冲区的位置(position)设置为移动后未读取数据的末尾。 将缓冲区的界限(limit)设置为缓冲区的容量,以准备进行写入操作。
- 通过使用 buffer.compact() 方法,可以在不清空整个缓冲区的情况下,为后续的写入操作提供空间,并保留未读取的数据供进一步处理。
示例代码
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());
}
}
}
输出结果:
Before compact - position: 0, limit: 5
After compact - position: 5, limit: 10
HelloWorld
clear方法源码解析
buffer.clear()是Java NIO中的一个方法,用于清空缓冲区并准备进行新的写入操作。 当调用 buffer.clear()方法时,它会执行以下操作:
- 将缓冲区的位置(position)设置为0,表示写入操作将从缓冲区的开头开始。
- 将缓冲区的界限(limit)设置为缓冲区的容量,表示整个缓冲区都可用于写入数据。
这样,buffer.clear()方法会重置缓冲区的状态,使其准备好接收新的数据写入。
需要注意的是,buffer.clear()方法并不会真正清空缓冲区中的数据,而是通过重置位置和界限来覆盖已存在的数据。这意味着在调用 buffer.clear()方法后,缓冲区中原有的数据仍然存在,但它们的内容可以被新的写入操作所覆盖。
因此,如果需要读取缓冲区中的数据,应在调用 buffer.clear()方法之前先处理已存在的数据,或者使用buffer.flip()方法切换到读取模式,并在读取完数据后再调用buffer.clear()方法进行写入操作的准备。
示例代码
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());
}
}
}
输出结果:
Hello
After clear - position: 0, limit: 10
World