如果要清除缓冲区但要将未读取的数据保留在缓冲区中,则需要使用compact()缓冲区的方法。该compact()方法会将未读数据复制到缓冲区的开头,并在未读数据之后立即设置位置。在limit本身仍然有值等于缓冲能力。缓冲区将准备好再次写入,而不会覆盖未读取的数据。
package org.nhooo.example.io;
import java.nio.CharBuffer;
public class BufferCompact {
public static void main(String[] args) throws Exception {
CharBuffer buffer = CharBuffer.allocate(64);
buffer.put("Let's write some Java code! ");
System.out.println("Position: " + buffer.position());
System.out.println("Limit : " + buffer.limit());
// 从缓冲区读取10个字符。
buffer.flip();
for (int i = 0; i < 10; i++) {
System.out.print(buffer.get());
}
System.out.println("");
System.out.println("Position: " + buffer.position());
System.out.println("Limit : " + buffer.limit());
// 使用compact()方法清除缓冲区。
buffer.compact();
System.out.println("Position: " + buffer.position());
System.out.println("Limit : " + buffer.limit());
// 写入和读取更多数据。
buffer.put("Add some more data.");
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print(buffer.get());
}
}
}上面的代码片段的输出是:
Position: 28 Limit : 64 Let's writ Position: 10 Limit : 28 Position: 18 Limit : 64 e some Java code! Add some more data.