如果要清除缓冲区但要将未读取的数据保留在缓冲区中,则需要使用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.